Python以特殊方式迭代数组数组

时间:2015-12-29 14:04:20

标签: python arrays

我有这个数组数组:

[[[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] ...

谢谢

4 个答案:

答案 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)