Python 我有一个长度不同的元组列表,所以我需要遍历这个列表
长度等于6的元组是正确的元组,而长度较短的元组是人工制品,应该将它们连接起来以给出6的长度 例如: 我有一个元组列表,如下所示:Python 我有一个长度不同的元组列表,所以我需要遍历这个列表,python,loops,tuples,Python,Loops,Tuples,长度等于6的元组是正确的元组,而长度较短的元组是人工制品,应该将它们连接起来以给出6的长度 例如: 我有一个元组列表,如下所示: foo = [(3, 1, 0, 1, 1, 1), (3, 1), (1, 1), (3, 1), (3, 1, 0, 1), (1, 2), (3, 3, 3, 1, 2, 2)] len(foo[0]) = 6 len(foo[1]) = 2 len(foo[2]) = 2 len(foo[3]) = 2 len(foo[4]) = 4 len(foo[5]
foo = [(3, 1, 0, 1, 1, 1), (3, 1), (1, 1), (3, 1), (3, 1, 0, 1), (1, 2), (3, 3, 3, 1, 2, 2)]
len(foo[0]) = 6
len(foo[1]) = 2
len(foo[2]) = 2
len(foo[3]) = 2
len(foo[4]) = 4
len(foo[5]) = 2
len(foo[6]) = 6
这意味着我希望有一个具有以下输出的列表:
foo_1 = [(3, 1, 0, 1, 1, 1), (3, 1, 1, 1, 3, 1), (3, 1, 0, 1, 1, 2), (3, 3, 3, 1, 2, 2)]
其中:
foo_1[1] = foo[1] + foo[2] + foo[3],
foo_1[2] = foo[4] + foo[5]
基本上,我需要遍历元组列表,并将每个元组的长度与6进行比较。如果元组的长度不等于6,我必须连接元组,直到它们的长度为6
import itertools
foo=[(3, 1, 0, 1, 1, 1), (3, 1), (1, 1), (3, 1), (3, 1, 0, 1), (1, 2), (3, 3, 3, 1, 2, 2)]
foo1=[i for t in foo for i in t]
list(itertools.zip_longest(*[iter(foo1)]*6))
输出:
[(3, 1, 0, 1, 1, 1),
(3, 1, 1, 1, 3, 1),
(3, 1, 0, 1, 1, 2),
(3, 3, 3, 1, 2, 2)]
或者只是迭代并使用slice
[foo1[i:i+6] for i in range(0,len(foo1),6)]
foo1
是所有元素的列表。之后,我们可以使用itertools中的切片
或zip\u longest
,以获得所需的结果
制作一个迭代器,聚合来自每个ITerable的元素。
如果iterables的长度不均匀,则会填充缺少的值
具有填充值。迭代将继续,直到找到最长的iterable
筋疲力尽的大致相当于:
如果总长度不是6的倍数
foo=[(3, 1, 0, 1, 1, 1), (3, 1), (1, 1), (3, 1), (3, 1, 0, 1), (1, 2), (3, 3, 3, 1, 2, 2),(1,)
我添加了一个额外的(1,)
如果我们需要一些填充值而不是None
,那么
list(itertools.zip_longest(*[iter(foo1)]*6,fillvalue=2))
(1, 2, 2, 2, 2, 2)
获得结果的简单方法可以使用 印刷品:
[3, 1, 0, 1, 1, 1]
[3, 1, 1, 1, 3, 1]
[3, 1, 0, 1, 1, 2]
[3, 3, 3, 1, 2, 2]
您可以创建一个函数来展平元组列表,然后使用生成器和zip将它们分组到适当的长度
>>> def flatten(lst):
for tup in lst:
yield from tup
>>> list(zip(*[flatten(foo)]*6))
[(3, 1, 0, 1, 1, 1),
(3, 1, 1, 1, 3, 1),
(3, 1, 0, 1, 1, 2),
(3, 3, 3, 1, 2, 2)]
您可以找到更多关于zip(*[iter(iterable)]*n)
工作原理的信息
或者您可以使用itertools.chain.from\u iterable
功能来完成展平部分:
>>> flat = chain.from_iterable(foo)
>>> list(zip(*[flat]*6))
[(3, 1, 0, 1, 1, 1),
(3, 1, 1, 1, 3, 1),
(3, 1, 0, 1, 1, 2),
(3, 3, 3, 1, 2, 2)]
如果值的总数不是6的倍数呢?我尝试了下面类似的方法,但无法获得所需的输出。ls=[]对于范围内的i(len(foo)):如果len(foo[i])==6:ls.append(foo[i]),则:ls.append(foo[i]+foo[i+1]),您自己的示例明确显示,有时需要3个元组组合成长度为6的元组之一。
>>> def flatten(lst):
for tup in lst:
yield from tup
>>> list(zip(*[flatten(foo)]*6))
[(3, 1, 0, 1, 1, 1),
(3, 1, 1, 1, 3, 1),
(3, 1, 0, 1, 1, 2),
(3, 3, 3, 1, 2, 2)]
>>> flat = chain.from_iterable(foo)
>>> list(zip(*[flat]*6))
[(3, 1, 0, 1, 1, 1),
(3, 1, 1, 1, 3, 1),
(3, 1, 0, 1, 1, 2),
(3, 3, 3, 1, 2, 2)]