我该如何使用列表推导式从一个列表构建一个2元组的元组。它应该等价于:
tup = ()
for element in alist:
tup = tup + ((element.foo, element.bar),)
我该如何使用列表推导式从一个列表构建一个2元组的元组。它应该等价于:
tup = ()
for element in alist:
tup = tup + ((element.foo, element.bar),)
tup = tuple((element.foo, element.bar) for element in alist)
从技术上讲,这是一个生成器表达式。它类似于列表推导式,但是惰性地求值,不需要为中间列表分配内存。
为了完整起见,列表推导式将如下所示:
tup = tuple([(element.foo, element.bar) for element in alist])
PS:attrgetter
不一定更快(这里 alist
有一百万个元素):
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
尽管已经有可行的答案:
tup = tuple((element.foo, element.bar) for element in alist)
最短的方法是:(逗号必须在末尾!):
tup = *((elements.foo, elements.bar) for elements in alist),
哪种解决方案更易读或更符合Python的编程风格是有争议的。
*(...)的解释: *(...),
tup = *[(element.foo, element.bar) for element in alist]
这将首先生成一个元组列表,然后将该元组列表转换为元组的元组。
tup = *[(element.foo, element.bar) for element in alist],
- Roman Kazakov
tuple(map(operator.attrgetter('foo','bar'),alist))
进行操作。为了可读性,我可能会使用您发布的那个,但是attrgetter
可能具有轻微的性能优势。如果在实际紧密循环中,请使用timeit
测试一下。 - mgilson