使用列表推导构建元组

92 投票
3 回答
92707 浏览
提问于 2025-04-17 19:05

我怎么能用列表推导式从一个列表中构建一个包含二元组的元组?这相当于下面的代码:

tup = ()
for element in alist:
    tup = tup + ((element.foo, element.bar),)

3 个回答

-2

你可以使用下面这个表达式

tup = *[(element.foo, element.bar) for element in alist]

这个表达式首先会生成一个包含多个小组的列表,然后再把这个列表转换成一个包含多个小组的整体。

3

尽管已经有了一个有效的答案:

tup = tuple((element.foo, element.bar) for element in alist)

最简洁的方法是(结尾的逗号是必须的!):

tup = *((elements.foo, elements.bar) for elements in alist),

关于哪个解决方案更易读或更符合Python风格,这个是可以争论的。

关于: *(...),

133
tup = tuple((element.foo, element.bar) for element in alist)

从技术上讲,这是一种生成器表达式。它和列表推导式很像,但它是懒惰计算的,也就是说,它不会为了中间的列表而占用内存。

为了完整起见,列表推导式看起来是这样的:

tup = tuple([(element.foo, element.bar) for element in alist])

 

另外,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

撰写回答