How can I use list comprehension to build a tuple of 2-tuple from a list. It would be equivalent to
tup = () for element in alist: tup = tup + ((element.foo, element.bar),)
A tuple comprehension is considered to be less fundamental than a list comprehension. So there is no special syntax dedicated for the same. Yet, if you want a tuple after applying comprehension, it can be achieved by wrapping a tuple around a generator object.
There is no tuple comprehension in Python. Comprehension works by looping or iterating over items and assigning them into a container, a Tuple is unable to receive assignments.
You can convert a list into a tuple simply by passing to the tuple function.
tuple () function can take any iterable as an argument and convert it into a tuple object. As you wish to convert a python list to a tuple, you can pass the entire list as a parameter within the tuple() function, and it will return the tuple data type as an output.
tup = tuple((element.foo, element.bar) for element in alist)
Technically, it's a generator expression. It's like a list comprehension, but it's evaluated lazily and won't need to allocate memory for an intermediate list.
For completeness, the list comprehension would look like this:
tup = tuple([(element.foo, element.bar) for element in alist])
PS: attrgetter
is not faster (alist
has a million items here):
In [37]: %timeit tuple([(element.foo, element.bar) for element in alist]) 1 loops, best of 3: 165 ms per loop In [38]: %timeit tuple((element.foo, element.bar) for element in alist) 10 loops, best of 3: 155 ms per loop In [39]: %timeit tuple(map(operator.attrgetter('foo','bar'), alist)) 1 loops, best of 3: 283 ms per loop In [40]: getter = operator.attrgetter('foo','bar') In [41]: %timeit tuple(map(getter, alist)) 1 loops, best of 3: 284 ms per loop In [46]: %timeit tuple(imap(getter, alist)) 1 loops, best of 3: 264 ms per loop
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With