Есть ли быстрый способ найти соответствующие списки в Python? - PullRequest
0 голосов
/ 04 августа 2020

У меня есть пара групп списков, и я хотел бы проверить, сколько у них перекрывающихся значений.

Мне удалось сделать это с помощью пары вложенных циклов, но мне интересно, есть ли там - это более эффективный способ выполнения или даже функция для одновременной обработки нескольких «групп», возвращающих массивы с наиболее перекрывающимися значениями.

Мой код пока выглядит так:

group1 = [['a','b','c'], ['1','2','3'], ['x','y','z','w'],['10','20','30','40']]
group2 = [['a','b','x','z'], ['1','2','3','4','5'], ['x','y','z','q','p'],['10','50','60','70']]
group3 = [['a','b','c','x','1'], ['1','2','3','4','6'], ['y','z','w','5'],['10','20','60','70']]

def match(grp1, grp2):
    for arr1 in grp1:
        for arr2 in grp2:
            overlap = len(arr1) + len(arr2) - len(set(arr1+arr2))
            if overlap > 0:
                print(overlap, overlap/len(arr1), overlap/len(arr2), arr1, arr2)

match(group1, group2)
print()
match(group1, group3)
print()
match(group3, group2)

1 Ответ

0 голосов
/ 04 августа 2020

Если вы используете set() и хотите еще немного абстрагироваться, вы можете использовать метод set.intersection(). Например:

s1 = set(['a', 'b', 'c'])
s2 = set(['a', 'b', 'x', 'z'])
print(list(s1.intersection(s2))) # ['a', 'b']
print(len(list(s1.intersection(s2)))) # 2

Как только вы почувствуете это на своих данных, вы можете использовать itertools.combinations для выполнения пересечений в комбинациях списков (преобразованных в наборы).

...