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

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

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 
  • Как получить доступ к аксессуарам для клавиатуры Windows on_screen через Python
  • Как правильно установить AUTO INCREMENT для столбца в SQLite, используя Python?
  • Python: URLError: <ошибка urlopen
  • Преобразуйте массив numpy в строку CSV и строку CSV обратно в массив numpy
  • Python, преобразование CSV-файла в таблицу SQL
  • Как используются хэш-строки Python 2.7.3 для генерации генераторов случайных чисел?
  • Преобразование даты и времени UTC с часовым поясом на локальный
  • Использовать текст Юникода с морским
  • Python - лучший язык программирования в мире.