我有列表清单。我需要将该列表的所有组合从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个组合的函数,它返回新的组合数组。 但由于这个错误,我不知道该怎么做。
有没有办法解决这个错误或其他方法来解决这个问题?
答案 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
来确保每个组合列表中的项目按升序排列。