[英]Python iterate over array of arrays special way
我有这个数组数组:
[[[1111, 2222, 3333], [4444, 5555, 6666]], [[7777]], [[8888, 9999]], [[0000]], [[1122, 2233]]]
我需要按列表元素的顺序获得所有可能的组合。
此示例的预期输出:
[1111,2222,3333,7777,8888,9999,0000,1122,2233]
[4444, 5555, 6666,7777,8888,9999,0000,1122,2233]
正如你在这个例子中看到的,数组的第一个数组是唯一一个有两个选项的数组。
我试过类似的东西:
for i in array_input:
for j in i:
print ', '.join([str(x) for x in j]),
但这并没有让我得到预期的输出,因为首先遍历两个 array[0] 选项,而不是选择其中一个并填充其余选项,然后选择另一个并填充它。
所以我想要一些循环获取array[0][0],array[1][0],array[2][0]
... 而不是: array[0][0],array[0][1],array[1][0]
...
谢谢你
您的元素是整数,因此0000
将显示为0
:
import itertools as it
lst = [[[1111, 2222, 3333], [4444, 5555, 6666]], [[7777]], [[8888, 9999]], [[0000]], [[1122, 2233]]]
out = [list(it.chain.from_iterable(x)) for x in it.product(*lst)]
首先itertools.product
生成所有参数的乘积。 然后你需要itertools.chain.from_iterable
来展平列表列表。
您可以使用 itertools.combinations,让我们将您的示例简化为列表 `l = ['a', 'b', 'c', 'd'] 然后您可以生成长度为 r 的所有组合:(这里即 r = 3)
import itertools as it
l = ['a', 'b', 'c', 'd']
for e in it.combinations(l, 3):
print e
=> ('a', 'b', 'c')
('a', 'b', 'd')
('a', 'c', 'd')
('b', 'c', 'd')
如果你想获得所有组合,只需在 l 的长度上循环你的 r
为了克服这两个数组的问题,您可以将列表展平,即使用类似的东西
new_list = [item for sublist in l for item in sublist]
完整示例:
import itertools as it
l = [[[1111, 2222, 3333], [4444, 5555, 6666]], [[7777]], [[8888, 9999]], [[0000]], [[1122, 2233]]]
l = [item for sublist in l for item in sublist]
for n in range(1, len(l)):
for e in it.combinations(l, n):
print e
您只需执行以下操作...
import operator
reduce(operator.__add__, zip(*array_input)[0])
zip(*array_input)
基本上将数组解压缩到...
[([1111, 2222, 3333], [7777], [8888, 9999], [0], [1122, 2233])]
zip(*array_input)[0]
只需删除一层嵌套...
最后, reduce
运算符将列表添加到单个列表中。 你也可以做到
reduce(lambda m, n: m+n, zip(*array_input)[0])
但我不喜欢在这里使用 lambda 函数......
list1 = [[[1111, 2222, 3333], [4444, 5555, 6666]], [[7777]], [[8888, 9999]], [[0000]], [[1122, 2233]]]
a = []
for i in list1:
for j in i:
for k in j:
a.append(k)
print(a)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.