枚举压缩列表时如何避免嵌套元组解包?

时间:2012-08-15 11:47:10

标签: python

在枚举像这样的元组列表时,如何避免使用嵌套元组解包?

for i, (x, y) in enumerate(zip("1234", "ABCD")):
    # do stuff

3 个答案:

答案 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 ... 。即使您知道您的代码不会,也有人可能会复制,修改您的代码并点击。所以这是个坏习惯。