我有一些代码包含zip(*G)[0]
(和其他地方,zip(*G)[1]
有不同的 G)。 G
是一个元组列表。这样做是将G 中每个元组的第一个(或通常,对于 th)元素的列表作为元组返回zip(*G)[n]
。n-1
例如,
>>> G = [(1, 2, 3), ('a', 'b', 'c'), ('you', 'and', 'me')]
>>> zip(*G)[0]
(1, 'a', 'you')
>>> zip(*G)[1]
(2, 'b', 'and')
这非常聪明,但问题是它在 Python 3 中不起作用,因为zip
那里有一个迭代器。此外,2to3 还不够聪明,无法修复它。所以显而易见的解决方案是使用list(zip(*G))[0]
,但这让我想到:可能有一种更有效的方法来做到这一点。不需要创建 zip 创建的所有元组。我只需要n
G 中每个元组的第 th 个元素。
有没有更有效但同样紧凑的方法来做到这一点?我对标准库中的任何内容都满意。在我的用例中,G 中的每个元组至少是 length n
,因此无需担心 zip 会在最小长度的元组处停止(即,zip(*G)[n]
将始终定义)。
如果没有,我想我会坚持将 in 包装zip
起来list()
。
(PS,我知道这是不必要的优化。我只是好奇而已)
更新:
万一有人在乎,我选择了这个t0, t1, t2 = zip(*G)
选项。首先,这让我可以给数据起有意义的名字。MyG
实际上由长度为 2 的元组组成(代表分子和分母)。列表理解只会比 zip 更具可读性,但这种方式要好得多(因为在大多数情况下,zip 是我在列表理解中迭代的列表,这让事情变得更平坦)。
其次,正如@thewolf 和@Sven Marnach 的出色答案所指出的那样,这种方式对于较小的列表来说更快。在大多数情况下,我的 G 实际上并不大(如果它很大,那么这绝对不会成为代码的瓶颈!)。
但是有比我预期更多的方法来做到这一点,包括a, *b, c = G
我什至不知道的 Python 3 的新特性。