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

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

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 к значению для этого ключа.

  • Клавиши слова поиска Python для ввода поиска
  • Как проверить Python, существует ли файл и создать его, если это не так?
  • Как преобразовать список нескольких целых чисел в одно целое?
  • Являются ли классные объекты одиночными?
  • Пустой кроссворд в Python
  • Переход на Python 3, вызывающий UnicodeDecodeError
  • Python 3: отправить метод генераторов
  • Python: как проверить, был ли элемент добавлен в набор, без 2x (хэш, поиск)
  • Python - лучший язык программирования в мире.