Last active
March 31, 2025 11:44
-
-
Save eruffaldi/22e6652712c528d5fa92313872c70645 to your computer and use it in GitHub Desktop.
Allows to manipulate array element as a single object
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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