Skip to content

Instantly share code, notes, and snippets.

@eruffaldi
Last active March 31, 2025 11:44
Show Gist options
  • Save eruffaldi/22e6652712c528d5fa92313872c70645 to your computer and use it in GitHub Desktop.
Save eruffaldi/22e6652712c528d5fa92313872c70645 to your computer and use it in GitHub Desktop.
Allows to manipulate array element as a single object
# WrappedArray by Emanuele Ruffaldi 2025
#
# Allows to execute function on all elements of an array
from typing import Callable, Any
class WrapperArray:
def __init__(self, items):
self.items = items
def __repr__(self):
return f"WrapperArray({self.items})"
def __getitem__(self, index):
return WrapperArray([x[index] for x in self.items])
@property
def call(self):
class MethodCaller:
def __init__(self, items):
self.items = items
def __getattr__(self, name):
def wrapper(*args, **kwargs):
result = [getattr(item, name)(*args, **kwargs) for item in self.items]
return WrapperArray(result) if isinstance(result, list) else result
return wrapper
return MethodCaller(self.items)
def prop(self,name):
return WrapperArray([getattr(item, name) for item in self.items])
def argmin(self, key: Callable[[Any], Any] = lambda x: x):
return min(self.items, key=key)
def argmax(self, key: Callable[[Any], Any] = lambda x: x):
return max(self.items, key=key)
def indexmin(self, key: Callable[[Any], Any] = lambda x: x):
return min(range(len(self.items)), key=lambda i: key(self.items[i]))
def indexmax(self, key: Callable[[Any], Any] = lambda x: x):
return max(range(len(self.items)), key=lambda i: key(self.items[i]))
def min(self, key: Callable[[Any], Any] = lambda x: x):
return min((key(x) for x in self.items))
def max(self, key: Callable[[Any], Any] = lambda x: x):
return max((key(x) for x in self.items))
def __repr__(self):
return self.items.__repr__()
# Example usage
print("Strings")
arr = WrapperArray(["apple", "banana", "cherry"])
print("Uppercase:", arr.call.upper())
print("Lengths:", arr.call.__len__())
print("First characters:", arr[0])
print("Min:", arr.min(key=lambda x: len(x)))
print("Min value:", arr.argmin(key=lambda x: len(x)))
print("Min index:", arr.indexmin(key=lambda x: len(x)))
print("Numeric")
nums = WrapperArray([3, 1, 4, 1, 5, 9])
print("Min index:", nums.indexmin())
print("Max index:", nums.indexmax())
print("Min value:", nums.min())
print("Max value:", nums.max())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment