我有一个像这样的嵌套列表:
values = [['DNO', 0.2], ['Equinor', 0.4], ['Petoro', 0.2], ['Total', 0.2]]
如何获取总和(每个子列表的第二个元素)大于0.5的元素的所有可能组合?
这就是我正在使用的:
def getCombinations(values, min_len):
combo = "\n"
numbers = []
doc = {}
for val in values:
doc[val[0]] = val[1]
numbers.append(val[1])
result = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) >= 0.5]
temp = doc.copy()
for r in result:
doc = temp.copy()
if len(r) >= min_len:
for rr in r:
combo = combo + get_key(doc, rr) + " "
doc.pop(get_key(doc, rr))
combo = combo + "\n"
return combo
当上面的列表中有多个值(例如0.2)时,我的算法存在一些问题。
当前它以min_length=3
返回:
Total Equinor Petoro DNO
Total Equinor Petoro
Total Equinor Petoro
Total Petoro DNO
Equinor Total Petoro
答案 0 :(得分:0)
以下方法应该起作用:
import itertools
result=[]
for k in range(2,len(values)+1):
temp=[tuple(x[0] for x in i) for i in list(itertools.combinations(values,k))if sum([p[1] for p in i]) >0.5]
result.append(temp)
result=sum(result, [])
print(result)
输出:
[('DNO', 'Equinor'), ('Equinor', 'Petoro'), ('Equinor', 'Total'), ('DNO', 'Equinor', 'Petoro'), ('DNO', 'Equinor', 'Total'), ('DNO', 'Petoro', 'Total'), ('Equinor', 'Petoro', 'Total'), ('DNO', 'Equinor', 'Petoro', 'Total')]
答案 1 :(得分:0)
您可以像这样使用列表理解:
说明:
for
定义组合的长度。使用从2到values
长度的每个长度。for
创建实际组合if
使用生成器方法对项目编号求和from itertools import combinations
combis = [
item
for length in range(2, len(values)+1)
for item in combinations(values, length)
if sum(i[1] for i in item) >= 0.5
]