Подсчитайте количество списков, содержащих определенный элемент во вложенном списке

У меня есть список, например:

res = [['a', 'b', 'a'], ['a', 'b', 'c'], ['a']] 

Я хочу подсчитать, сколько списков содержит конкретное письмо. Например, «a» содержится в 3 списках, «b» содержится в 2 списках, а «c» содержится в 1 списке.

Код ниже – это то, что у меня есть до сих пор:

 count=0 docs='a' list1=[] for c in range(len(res)): for i in res[0]: list1.append(i) for i in list1: if i == docs: count=1 print count 

2 Solutions collect form web for “Подсчитайте количество списков, содержащих определенный элемент во вложенном списке”

Когда вы обнаружите, что говорите «Я хочу подсчитать, сколько …», есть хорошая возможность помочь Counter() из модуля collections .

В этом случае мы хотим подсчитать, сколько списков происходит в каждой букве. Поскольку мы не хотим считать каждую букву более одного раза для каждого подсписок, мы преобразуем их в множества :

 >>> res = [['a', 'b', 'a'], ['a', 'b', 'c'], ['a']] >>> [set(x) for x in res] [{'b', 'a'}, {'c', 'b', 'a'}, {'a'}] 

Порядок путается, но это не имеет значения, если у нас есть только одна буква из каждого списка.

Теперь мы хотим присоединиться к этим наборам букв в одну последовательность, чтобы мы могли их сосчитать. Мы могли бы сделать это следующим образом:

 >>> [s for x in res for s in set(x)] ['b', 'a', 'c', 'b', 'a', 'a'] 

… но это немного сложно. К счастью, в модуле itertools называемом chain() , есть функция, которая делает то же самое и ее немного легче читать. Нам нужна версия chain.from_iterable() :

 >>> from itertools import chain >>> c = chain.from_iterable(set(x) for x in res) >>> list(c) ['b', 'a', 'c', 'b', 'a', 'a'] 

Не беспокойтесь об этом list(c) слишком много – chain() возвращает итератор , что означает, что ничего не вычисляется до тех пор, пока мы на самом деле ничего не сделаем с результатом (например, сделаем это в список), поэтому я сделал это, чтобы показать, что это производит.

В любом случае, все, что нам нужно сделать, это передать эту последовательность в Counter() :

 >>> from collections import Counter >>> Counter(chain.from_iterable(set(x) for x in res)) Counter({'a': 3, 'b': 2, 'c': 1}) 

Вот и все:

 from collections import Counter from itertools import chain res = [['a', 'b', 'a'], ['a', 'b', 'c'], ['a']] letter_count = Counter(chain.from_iterable(set(x) for x in res)) print(letter_count['a']) # prints 3 

Простое понимание списка делает трюк.

 >>> L=[['a', 'b', 'a'], ['a', 'b', 'c'], ['a']] >>> ['a' in x for x in L] [True, True, True] >>> ['b' in x for x in L] [True, True, False] 

Используя знание, что True считается 1 :

 >>> sum('a' in x for x in L) 3 >>> sum('b' in x for x in L) 2 >>> sum('c' in x for x in L) 1 
  • Как запустить код Python на SublimeREPL
  • Python: экспорт переменных среды в subprocess.Popen (..)
  • Проблемы с использованием MySQL с AWS Lambda в Python
  • Могу ли я реализовать пользовательский отступ для довольно-типовой печати в модуле JSON Python?
  • scrapy spider отправляет сигнал spider_close перед закрытием
  • cc1: ошибка: непризнанная опция командной строки «-Wno-null-conversion» при установке python-mysql на mac 10.7.5
  • Получить основной текст сообщения электронной почты с помощью пакета python imap и электронной почты
  • Python Selenium: ошибка профиля Firefox
  • TypeError: объект 'int' не вызываем ,,, len ()
  • Установка нескольких переменных из открытого файла - Python
  • установить прекрасный суп, используя пип
  • Python - лучший язык программирования в мире.