Как получить количество списков с определенным элементом?

У меня есть список списков, который выглядит как

listOfLists = [ ['a','b','c','d'], ['a','b'], ['a','c'], ['c','c','c','c'] ] 

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

 {'a':3,'b':2,'c':3,'d':1} 

Как вы можете видеть, мне не нужен общий счет элемента. В случае "c" , хотя его общий счет равен 5, выход равен 3, поскольку он встречается только в 3 списках.

Я использую счетчик, чтобы получить счет. То же самое можно увидеть ниже.

 line_count_tags = [] for lists in lists_of_lists: s = set() for element in lists: s.add(t) lines_count_tags.append(list(s)) count = Counter([count for counts in lines_count_tags for count in counts]) 

Итак, когда я печатаю счет, я получаю

 {'a':3,'c':3,'b':2,'d':1} 

Я хочу знать, есть ли лучший способ достичь моей цели.

7 Solutions collect form web for “Как получить количество списков с определенным элементом?”

Используйте Counter и конвертируйте каждый список в набор. set удалит любые дубликаты из каждого списка, чтобы вы не учитывали повторяющиеся значения в одном списке:

 >>> from collections import Counter >>> Counter(item for lst in listOfLists for item in set(lst)) Counter({'a': 3, 'b': 2, 'c': 3, 'd': 1}) 

Если вам нравится функциональное программирование, вы также можете listOfLists chain set map ped listOfLists на Counter :

 >>> from collections import Counter >>> from itertools import chain >>> Counter(chain.from_iterable(map(set, listOfLists))) Counter({'a': 3, 'b': 2, 'c': 3, 'd': 1}) 

Что абсолютно эквивалентно (за исключением, может быть, немного быстрее) к первому подходу.

Я бы преобразовал каждый список в виде набора перед подсчетом в понимании генератора, переданного Counter :

 import collections print(collections.Counter(y for x in listOfLists for y in set(x))) 

результат:

 Counter({'a': 3, 'c': 3, 'b': 2, 'd': 1}) 

(это практически то, что вы сделали, но приведенный выше код сокращает количество циклов и временное создание списка)

Вы можете сделать это без Counter :

 result = {} for lis in listOfLists: for element in set(lis): result[element] = result.get(element, 0) + 1 print result # {'a': 3, 'c': 3, 'b': 2, 'd': 1} 

Не самый элегантный, но должен быть значительно быстрее.

Немного стилистическая разница в itertools.chain.from_iterable Counter с itertools.chain.from_iterable может выглядеть так:

 Counter(chain.from_iterable(map(set, listOfLists))) 

демонстрация

 >>> from itertools import chain >>> from collections import Counter >>> Counter(chain.from_iterable(map(set, listOfLists))) Counter({'a': 3, 'b': 2, 'c': 3, 'd': 1}) 

Грубый бенчмарк

 %timeit Counter(item for lst in listOfLists for item in set(lst)) 100000 loops, best of 3: 13.5 µs per loop %timeit Counter(chain.from_iterable(map(set, listOfLists))) 100000 loops, best of 3: 12.4 µs per loop 

Просто конвертируйте в set , itertools.chain.from_iterable используя itertools.chain.from_iterable а затем подайте в Counter .

 from collections import Counter from itertools import chain inp = [ ['a','b','c','d'], ['a','b'], ['a','c'], ['c','c','c','c'] ] print(Counter(chain.from_iterable(map(set, inp)))) 

Этот подход вычисляет уникальные записи в listOfLists с использованием набора listOfLists , а затем подсчитывает вхождения в каждом списке, используя понимание словаря

 A = {val for s in listOfLists for val in s} d = {i: sum( i in j for j in listOfLists) for i in A} print(d) # {'a': 3, 'c': 3, 'b': 2, 'd': 1} 

Я признаю, что это немного уродливо, но это возможное решение (и простое использование понимания словаря). Вы также можете сделать это одним лайнером, переместив вычисление A справа в понимание словаря

Вот еще одна версия с использованием циклов:

 listOfLists = [ ['a','b','c','d'], ['a','b'], ['a','c'], ['c','c','c','c'] ] final = {} for lst in listOfLists: for letter in lst: if letter in final: final[letter] += 1 else: final[letter] = 1 

Поэтому создайте пустой словарь под названием final. Затем пропустите каждую букву каждого списка. Создайте новый ключ и значение = 1, если письмо еще не существует в финале в качестве ключа. В противном случае добавьте 1 к значению для этого ключа.

  • Стройте 2 списка за один раз при чтении из файла, пифонически
  • Почему ... == True возвращает False в Python 3?
  • Удалить определенные ключи из словаря в python
  • Каковы хорошие возможности использования «Аннотации функций» Python3,
  • Незакрываемое окно с использованием tkinter
  • Для печати в кольцевой печати памяти класса вместо списка
  • 2d в python - доступ через имена столбцов
  • как пропустить строки файла, если они пусты
  • python3 - узнав о поиске, этот очень простой пример не работает правильно
  • sort () возвращает None
  • Как я могу запретить моей программе добавлять ненужные пустые строки при чтении и печати из текстового файла - Python3
  • Python - лучший язык программирования в мире.