没有重复的联盟列表

时间:2018-04-16 11:41:04

标签: python numpy itertools

我有列表清单。我需要将该列表的所有组合从N 的 2到N N. 我正在用itertools.combinations搜索它。在此之后我得到了列表列表,我需要将它们组合起来而不重复。

例如我有阵列:

a = np.array([[1,4,7],[8,2,5],[8,1,4,6],[8,1,3,5],
              [2,3,4,7],[2,5,6,7],[2,3,4,6,8],[1,3,5,6,7]])

我正在搜索所有3种元素组合:

a2 = list(itertools.combinations(a, 3))

a2[:5]
[([1, 4, 7], [8, 2, 5], [8, 1, 4, 6]),
 ([1, 4, 7], [8, 2, 5], [8, 1, 3, 5]),
 ([1, 4, 7], [8, 2, 5], [2, 3, 4, 7]),
 ([1, 4, 7], [8, 2, 5], [2, 5, 6, 7]),
 ([1, 4, 7], [8, 2, 5], [2, 3, 4, 6, 8])]

这个数组的长度:56。 我需要组合此数组中的每个列表而不重复。 例如a2 [0]输入:

([1, 4, 7], [8, 2, 5], [8, 1, 4, 6])

输出:

[1, 2, 4, 5, 6, 7, 8]

所有56个元素。 我试着用 set

来做
arr = list(itertools.combinations(a,3))
for i in arr:
    arrnew[i].append(list(set().union(arr[i][:3])))

但我有错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-75-4049ddb4c0be> in <module>()
      3 arrnew = []
      4 for i in arr:
----> 5     for j in arr[i]:
      6         arrnew[i].append(list(set().union(arr[:n])))

TypeError: list indices must be integers or slices, not tuple

我需要N个组合的函数,它返回新的组合数组。 但由于这个错误,我不知道该怎么做。

有没有办法解决这个错误或其他方法来解决这个问题?

4 个答案:

答案 0 :(得分:1)

解决它的小功能:

def unique_comb(a):
    return list(set(itertools.chain(*a)))

例如:

unique_comb(([1, 4, 7], [8, 2, 5], [8, 1, 4, 6]))

如果要将列表作为参数传递给函数,而不是传递给元组中的列表,只需删除*(解压缩列表)。

如果要在一个语句中将其应用于整个数组而不定义函数:

a3 = [list(set(itertools.chain(*row))) for row in a2]

答案 1 :(得分:0)

展平列表元组:

from itertools import chain
new_tuple = [ list(set(chain.from_iterable(each_tuple))) for each_tuple in main_tuple_coll ]

我认为这可能会解决您的问题。

答案 2 :(得分:0)

拼合列表组合

comb = []
for line in a2[:3]:
    l = list(set([x for y in line for x in y]))
    comb.append(l)
comb

[OUT]

[[1, 2, 4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 7, 8], [1, 2, 3, 4, 5, 7, 8]]

答案 3 :(得分:0)

问题:

arr = list(itertools.combinations(a,3))
for i in arr:
    arrnew[i].append(list(set().union(arr[i][:3])))

i是否不是项目的索引,而是列表本身的项目。

您需要的是:

import itertools
import numpy as np
a = np.array([[1,4,7],[8,2,5],[8,1,4,6],[8,1,3,5],
              [2,3,4,7],[2,5,6,7],[2,3,4,6,8],[1,3,5,6,7]])
arrnew = []

for item in itertools.combinations(a,3):
    arrnew.append(list(set().union(*item)))

结果arrnew包含56个项目。有些是相同的,但没有一个包含重复。

我建议使用sorted而不是list来确保每个组合列表中的项目按升序排列。