Python: как удалить кортеж из большого списка на основе сходства с другими кортежами - PullRequest
0 голосов
/ 27 октября 2019

У меня есть некоторые проблемы с упражнением на питоне. У меня есть большой список кортежей из 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] 

, но, похоже, это не сработало.

Любая помощь?

Ответы [ 2 ]

2 голосов
/ 27 октября 2019

Вы не можете изменять список (или устанавливать, или диктовать), пока вы зацикливаете его в 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))]
1 голос
/ 27 октября 2019

Я проверил это, и оно работает, распечатайте некоторые журналы, чтобы посмотреть, что происходит

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);
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)];
counter=0
print(len(Comb))
for x in Comb:
    for j in L:
        similarity = len(set(x).intersection(set(j)))
        if similarity > 7:
            print(str(similarity)+"\n"+str(set(x))+"\n"+str(set(j))+"\n\n")
            del Comb[counter]
    counter+=1;

print(len(Comb))
...