trimesh.iteration¶
- class trimesh.iteration.IndexedDict(*args, **kwargs)¶
Bases:
OrderedDictAn append-only OrderedDict which knows what position a key was inserted at.
Useful anywhere values are referenced by position but keyed by content so duplicates are only stored once: the only other spelling is list(d.keys()).index(key), which allocates every key and scans it, i.e. quadratic. Looking up the position of all n keys once each:
n list(keys()).index() this class 2000 0.061s 0.00007s 4000 0.262s 0.00012s 8000 1.135s 0.00026s
Removing or reordering a key would shift the position of every key after it, so __delitem__, pop, popitem, and move_to_end raise: the supported way to remove is clear followed by update.
Examples
In [1]: IndexedDict({“a”: 1, “b”: 2, “c”: 3}).index(“c”) Out[1]: 2
- __init__(*args, **kwargs)¶
- clear() None¶
Remove all items from ordered dict.
- index(key) int¶
Which position in insertion order was key inserted at.
- move_to_end(*args, **kwargs)¶
Move an existing element to the end (or beginning if last is false).
Raise KeyError if the element does not exist.
- pop(key[, default]) v, remove specified key and return the corresponding value.¶
If the key is not found, return the default if given; otherwise, raise a KeyError.
- popitem(*args, **kwargs)¶
Remove and return a (key, value) pair from the dictionary.
Pairs are returned in LIFO order if last is true or FIFO order if false.
- trimesh.iteration.chain(*args: Iterable[Any] | Any | None) list[Any]¶
A less principled version of list(itertools.chain(*args)) that accepts non-iterable values, filters None, and returns a list rather than yielding values.
If all passed values are iterables this will return identical results to list(itertools.chain(*args)).
Examples
In [1]: list(itertools.chain([1,2], [3])) Out[1]: [1, 2, 3]
In [2]: trimesh.util.chain([1,2], [3]) Out[2]: [1, 2, 3]
In [3]: trimesh.util.chain([1,2], [3], 4) Out[3]: [1, 2, 3, 4]
- In [4]: list(itertools.chain([1,2], [3], 4))
—-> 1 list(itertools.chain([1,2], [3], 4)) TypeError: ‘int’ object is not iterable
In [5]: trimesh.util.chain([1,2], None, 3, None, [4], [], [], 5, []) Out[5]: [1, 2, 3, 4, 5]
- Parameters:
args – Will be individually checked to see if they’re iterable before either being appended or extended to a flat list.
- Returns:
The values in a flat list.
- Return type:
chained
- trimesh.iteration.reduce_cascade(operation: Callable, items: Sequence | NDArray)¶
Call an operation function in a cascaded pairwise way against a flat list of items.
This should produce the same result as functools.reduce if operation is commutable like addition or multiplication. This may be faster for an operation that runs with a speed proportional to its largest input, which mesh booleans appear to.
The union of a large number of small meshes appears to be “much faster” using this method.
This only differs from functools.reduce for commutative operation in that it returns None on empty inputs rather than functools.reduce which raises a TypeError.
- For example on a b c d e f g this function would run and return:
a b c d e f ab cd ef g abcd efg
-> abcdefg
- Where functools.reduce would run and return:
a b ab c abc d abcd e abcde f abcdef g
-> abcdefg
- Parameters:
operation – The function to call on pairs of items.
items – The flat list of items to apply operation against.