Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我有一个长度不同的元组列表,所以我需要遍历这个列表_Python_Loops_Tuples - Fatal编程技术网

Python 我有一个长度不同的元组列表,所以我需要遍历这个列表

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]

长度等于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]) = 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)]