Python,将多个列表压缩成一个列表,其中一个列表需要每个项目都包含两个项

9

以下是一个示例列表:

a = ['#12908069', '#12906115', '#12904949', '#12904654', '#12904288', '#12903553']    
b = ['85028,', '83646,', '77015,', '90011,', '91902,', '80203,']    
c = ['9.09', '9.09', '1.81', '3.62', '1.81', '1.81', '9.09', '9.09', '1.81', '3.62', '1.81', '1.81']    
d = ['Zone 3', 'Zone 3', 'Zone 2']

作为输出,我想要实现的第一个项目集被压缩为一个示例:

[('#12908069', '85028', (9.09, 9.09), 'Zone 3'), ...]

我该如何让zip()为列表c中的每个元组添加一个额外的项目?
4个回答

13

6

使用从zip文档中聚合数据系列为n长度组的成语:

>>> gr = [iter(c)]*2
>>> list(zip(a, b, zip(*gr), d))
[('#12908069', '85028,', ('9.09', '9.09'), 'Zone 3'),
 ('#12906115', '83646,', ('1.81', '3.62'), 'Zone 3'),
 ('#12904949', '77015,', ('1.81', '1.81'), 'Zone 2')]

基本上,为了从列表 c 中获取两个连续的元素,我们将相同的迭代器放置在由两个元素组成的 gr 列表上。
然后,我们将这些相同的迭代器传递给zip(解包列表,就好像我们将这两个迭代器作为两个单独的参数传递给它一样)。
这具有从列表 c 中收集每个连续的两个元素的效果。
然后,我们再次将这样的zip和其他列表传递给zip,以扫描并配对整个内容。

这很聪明,但在我看来非常难以维护,我不得不理解对同一迭代器的两个引用的副本。 - Aprillion
1
@Aprillion,这种习惯用法在将数据系列聚类成n长度组方面非常常见。 - Pynchia
嗯,看起来已经添加到文档中了 - https://bugs.python.org/issue23695 - 我只需要适应一下就好了 :) - Aprillion
1
顺便提一下,注意它不会创建任何新列表(至少在Python 3中),而切片会创建。 - Pynchia

3
使用Python的itertools库中的一个“recipes”(配方)之一: Recipes itertools
>>> from itertools import zip_longest
>>> 
>>> def grouper(iterable, n, fillvalue=None):
...     "Collect data into fixed-length chunks or blocks"
...     # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
...     args = [iter(iterable)] * n
...     return zip_longest(*args, fillvalue=fillvalue)
... 
>>> list(zip(a, b, grouper(c, 2), d))
[('#12908069', '85028,', ('9.09', '9.09'), 'Zone 3'), ('#12906115', '83646,', ('1.81', '3.62'), 'Zone 3'), ('#12904949', '77015,', ('1.81', '1.81'), 'Zone 2')]

0
尝试以下代码:
a = ['#12908069', '#12906115', '#12904949', '#12904654', '#12904288', '#12903553']
b = ['85028,', '83646,', '77015,', '90011,', '91902,', '80203,']
c = ['9.09', '9.09', '1.81', '3.62', '1.81', '1.81', '9.09', '9.09', '1.81', '3.62', '1.81', '1.81']
d = ['Zone 3', 'Zone 3', 'Zone 2']

result = list(zip(a, b, [(c[i*2],c[i*2+1]) for i in range(len(c)//2)], d))
print(result)

result = list(zip(...) 就可以了。不需要 i,j,m,n - Pynchia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接