python эффективно сравнивает список списков

У меня длинный список длинных списков, поэтому эффективность для меня – проблема. Я задавался вопросом, был ли более простой способ сравнения списка списков, кроме циклов по списку в цикле одного и того же списка (проще увидеть на примере)

matchList=[] myList = [ ('a',[1,2,3]), ('b', [2,3,4]), ('c', [3,4,5]), ('d', [4,5,6]) ] tup_num=1 for tup in myList: for tup2 in myList[tup_num:]: id=str(tup[0])+':'+str(tup2[0]) matches=set(tup[1]) & set(tup2[1]) matchList.append((id,matches)) tup_num+=1 print matchList 

Вывод:

 [('a:b', set([2, 3])), ('a:c', set([3])), ('a:d', set([])), ('b:c', set([3, 4])), ('b:d', set([4])), ('c:d', set([4, 5]))] 

Это работает и не повторяет сравнения, но я уверен, что должен быть лучший способ сделать это.

ура

3 Solutions collect form web for “python эффективно сравнивает список списков”

Использование itertools.combinations :

 >>> import itertools >>> matchList = [] >>> myList = [('a',[1,2,3]), ('b', [2,3,4]), ('c', [3,4,5]), ('d', [6,7,8])] >>> matchList = [ ... ('{}:{}'.format(key1, key2), set(lst1) & set(lst2)) ... for (key1, lst1), (key2, lst2) in itertools.combinations(myList, 2) ... ] >>> matchList [('a:b', set([2, 3])), ('a:c', set([3])), ('a:d', set([])), ('b:c', set([3, 4])), ('b:d', set([])), ('c:d', set([]))] 
  • Сначала конвертируйте эти списки в настройки. Это операция O (n), которую лучше избегать.
  • itertools.combinations быстрее и проще.

Как это:

 >>> from itertools import combinations >>> l [('a', [1, 2, 3]), ('b', [2, 3, 4]), ('c', [3, 4, 5]), ('d', [6, 7, 8])] >>> l = [(i, set(j)) for i, j in l] >>> l [('a', {1, 2, 3}), ('b', {2, 3, 4}), ('c', {3, 4, 5}), ('d', {8, 6, 7})] >>> [("%s:%s" % (l1[0], l2[0]), l1[1] & l2[1]) for l1, l2 in combinations(l, 2)] [('a:b', {2, 3}), ('a:c', {3}), ('a:d', set()), ('b:c', {3, 4}), ('b:d', set()), ('c:d', set())] 

Использование состава и генераторов дает понять:

 from itertools import combinations matchList = [] myList = [ ('a',[1,2,3]), ('b', [2,3,4]), ('c', [3,4,5]), ('d', [4,5,6]) ] def sets(items): for name, tuple in items: yield name, set(tuple) def matches(sets): for a, b in combinations(sets, 2): yield ':'.join([a[0], b[0]]), a[1] & b[1] print list(matches(sets(myList))) >>> [('a:b', set([2, 3])), ('a:c', set([3])), ('a:d', set([])), ('b:c', set([3, 4])), ('b:d', set([4])), ('c:d', set([4, 5]))] 
  • Объединение 1D и 2D-списков в python
  • Python: проверка объектов в списке и переполнение «__cmp__»
  • Запись CSV без разделителей в Python
  • Пересечение подэлементов множественного списка списков в словаре
  • Python3 AttributeError: объект 'list' не имеет атрибута 'clear'
  • Как найти количество вложенных списков в списке?
  • Как хэш-списки?
  • Почему отсортированный список больше, чем несортированный список
  • Постройте трехмерную поверхность из «списка списков», используя matplotlib
  • Как я могу подсчитать появление каждого слова в документе, используя понимание словаря
  • Добавить элементы набора в список в Python
  • Python - лучший язык программирования в мире.