Список Python, сохранить все значения, присутствующие во всех подсписках списка - PullRequest
1 голос
/ 11 октября 2019

Мне нужно найти все значения, которые присутствуют во всех подсписках большого списка (все они идентификаторы)

Я попробовал сначала получить все уникальные значения, присутствующие во всем списке, и они проверяют каждое значениено это очень медленно в большом списке

l1 = ["a", "b", "c", "d", "e", "f"]
l2 = ["b", "c", "e", "f", "g"]
l3 = [ "b", "c", "d", "e", "f", "h"]
LL = [l1, l2, l3]
LL
unique_ids = set(x for l in LL for x in l)

filter_id = []
lenList = len(LL)
for id in unique_ids:
    if sum(id in item for item in LL) == lenList:
        filter_id.append(id)

Как я могу ускорить поиск?

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Мне нужно найти все значения, которые присутствуют во всех подсписках большого списка (все они идентификаторы).

Если мы сделаем эти подсписки в одном списке, наш "значения, которые присутствуют во всех подсписках ", будут там ровно len(LL) раз (в данном случае: 3). ;)

Это можно сделать в одну строку с помощью счетчика:

from collections import Counter

result = [key for key, value in Counter(elem for sub_list in LL for elem in set(sub_list)).items() if value == len(LL)]

Объяснение:

  • set(sub_list) - мы избавляемся от неожиданных дубликатов вподсписки, чтобы не запутать наш счетчик
  • (elem for sub_list in LL for elem in set(sub_list)) - сведение его в одну итерацию
  • Counter - возвращает словарь, сколько раз каждый элемент присутствовал в итерируемой
  • dict.items() получает ключи и значения в виде пар
  • if value == len(LL) - фильтрует ключи, присутствующие в каждом подсписке

Редактировать: Подробнеечитабельность что к чему:

result = [key 
          for key, value in Counter(elem 
                                    for sub_list in LL 
                                    for elem in set(sub_list)
                                   ).items() 
          if value == len(LL)]
0 голосов
/ 11 октября 2019

Создать набор элементов, найденных во всех списках:

from itertools import chain
{elem for elem in chain(l1, l2, l3) if elem in l1 and elem in l2 and elem in l3}
# {'f', 'c', 'e', 'b'}
...