繁体   English   中英

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM