首页 > 解决方案 > Python:如何根据与其他元组的相似性从大列表中删除元组

问题描述

我对 python 练习有一些问题。我有一个包含 10 个元素的元组的大列表,其中包含 20 个数字的所有组合。

import itertools

Comb = []

data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
for i in itertools.combinations(data, 10):
        Comb.append(i)

我想减少列表删除与另一个列表的元组至少有 7 个元素的元组

L=[(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),(11,12,13,14,15,16,17,18,19,20),(1, 2, 3, 5, 6, 7, 9, 10, 11, 12)]

我试图这样解决:

for x in Comb:
    for i, y in enumerate(Comb):
        for j in L:
            similarity = len(set(y).intersection(set(j)))
            if similarity > 7:
              del Comb[i] 

但这似乎不起作用。

有什么帮助吗?

标签: pythonlistsettuplescombinations

解决方案


在 Python 中循环遍历列表时,不能修改列表(或集合或字典)​​。

最简单的解决方案是创建一个新列表。

import itertools
comb = list(itertools.combinations(range(10), 5))

# We'll remove any element with more than 3 even or odd numbers.
filters = ({0, 2, 4, 6, 8}, {1, 3, 5, 7, 9})
threshold = 3

result = []
for element in comb:
    for filter_element in filters:
        if len(filter_element.intersection(element)) <= threshold:
            result.append(element)

# Make it smaller with a list comprehension
[elt for elt in comb
 if any(len(f.intersection(elt)) <= threshold for f in filters))]

推荐阅读