在枚举像这样的元组列表时,如何避免使用嵌套元组解包?
for i, (x, y) in enumerate(zip("1234", "ABCD")):
# do stuff
答案 0 :(得分:1)
使用itertools.count
来避免嵌套元组解包:
for i, x, y in zip(count(), "1234", "ABCD"):
# do stuff
答案 1 :(得分:0)
使用自定义zip
- 类似函数返回列表列表而不是元组列表。
def zip2(*sequences):
"""zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]
Return a list of lists, where each list contains the i-th element
from each of the argument sequences. The returned list is truncated
in length to the length of the shortest argument sequence."""
if not sequences:
return []
result = []
iterators = [iter(seq) for seq in sequences]
while True:
try:
items = [next(it) for it in iterators]
except StopIteration:
return result
result.append(items)
for i, v in enumerate(zip2("1234", "ABCD")):
print i, v[0], v[1]
答案 2 :(得分:-1)
该代码很好,并且是最简洁的习惯用法。
尝试避免它解决了一个非问题,实际上,使用itertools.count
比使用enumerate
更糟糕,因为一个陷阱是,如果我们曾经使用{{ 1}} /迭代器的长度不同,因为zip_longest
是无限迭代器:
count()
,即两个迭代器的长度相同,或者可以将较长的迭代器缩短为较短的迭代器,则itertools.count
可以使用:zip()
如果我们使用for i, x, y in itertools.zip_longest(count(), "1234", "ABCD"): print(f'{i}: {x} {y}')
,itertools.count
会中断(即无限运行),迭代器的长度是不同的:izip_longest()
因为对于相同大小的迭代器有一个习惯用法,对于不同长度的迭代器有一个习惯用法,这非常令人困惑,所以我们通常不应该为此使用for i, x, y in itertools.zip_longest(count(), "1234", "ABCDE"):
print(f'{i}: {x} {y}')
0: 1 A
1: 2 B
2: 3 C
3: 4 D
4: None E
5: None None
6: None None
...
。即使您知道您的代码不会,也有人可能会复制,修改您的代码并点击。所以这是个坏习惯。