我有这个数组数组:
[[[1111, 2222, 3333], [4444, 5555, 6666]], [[7777]], [[8888, 9999]], [[0000]], [[1122, 2233]]]
我需要获得列表元素的所有可能组合IN ORDER。
此示例的预期输出:
[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]),
但这并没有让我获得预期的输出,因为它首先迭代两个数组[0]选项,而不是选择其中一个并填充其余部分,然后选择另一个并填充它。
所以我想要一些得到array[0][0],array[1][0],array[2][0]
的循环...而不是:array[0][0],array[0][1],array[1][0]
...
谢谢
答案 0 :(得分:2)
您的元素是整数,因此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
来展平列表列表。
答案 1 :(得分:0)
你可以使用itertools.combinations,让你的例子简化为列表`l = [' a',' b',' c',&# 39; 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')
如果你想获得所有组合,只需将你的r循环遍及l
要克服两个阵列的问题,你可以将列表弄平,即用
之类的东西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
答案 2 :(得分:0)
您可以执行以下操作...
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函数......
答案 3 :(得分:0)
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)