Подсчет количества вхождений в списке кортежей
Я новичок в python, но мне не удалось найти решение проблемы.
Я хочу подсчитать вхождения строки внутри списка кортежей.
Вот список кортежей:
list1 = [
('12392', 'some string', 'some other string'),
('12392', 'some new string', 'some other string'),
('7862', None, 'some other string')
]
Я пробовал это, но он просто печатает 0
for entry in list1:
print list1.count(entry[0])
Поскольку один и тот же идентификатор дважды появляется в списке, он должен возвращать:
2
1
Я также пытался увеличить счетчик для каждого вхождения одного и того же идентификатора, но не мог понять, как его записать.
* EDIT:
Использование Eumiro удивительный ответ. Я просто понял, что я не объяснил всю проблему.
Мне действительно нужно общее количество записей, которое имеет значение больше 1. Но если я попытаюсь сделать:
for name, value in list1:
if value > 1:
print value
Я получаю эту ошибку:
ValueError: Too many values to unpack
Ответы
Ответ 1
Возможно, collections.Counter
может решить вашу проблему:
from collections import Counter
Counter(elem[0] for elem in list1)
возвращает
Counter({'12392': 2, '7862': 1})
Это быстро, так как он перебирает ваш список только один раз. Вы перебираете записи и затем пытаетесь подсчитать количество этих записей в своем списке. Это невозможно сделать с помощью .count
, но может быть сделано следующим образом:
for entry in list1:
print sum(1 for elem in list1 if elem[0] == entry[0])
Но серьезно, посмотрите collections.Counter
.
EDIT: мне действительно нужно общее количество записей, которое имеет значение больше 1.
Вы можете использовать Counter
:
c = Counter(elem[0] for elem in list1)
sum(v for k, v in c.iteritems() if v > 1)
возвращает 2
, т.е. сумму отсчетов, превышающих 1.
Ответ 2
list1.count(entry[0])
не будет работать, потому что он смотрит на каждый из трех кортежей в list1
, например. ('12392', 'some string', 'some other string')
и проверяет, если они равны, например, '12392'
, что, очевидно, не так.
@eurmiro ответ показывает, как это сделать с помощью Counter
(это лучший способ!), но вот версия для бедных людей, чтобы проиллюстрировать, как Counter
работает с использованием словаря и метода dict.get(k, [,d])
, который будет пытаться для получения ключа (k
), но если он не существует, он возвращает значение по умолчанию (d
):
>>> list1 = [
('12392', 'some string', 'some other string'),
('12392', 'some new string', 'some other string'),
('7862', None, 'some other string')
]
>>> d = {}
>>> for x, y, z in list1:
d[x] = d.get(x, 0) + 1
>>> d
{'12392': 2, '7862': 1}
Ответ 3
Мне нужны были дополнительные функции, которых у Counter не было. У меня есть список кортежей, что первый элемент является ключом, а второй элемент является суммой, которую нужно добавить. Решение @jamylak было отличной адаптацией для этого!
>>> list = [(0,5), (3,2), (2,1), (0,2), (3,4)]
>>> d = {}
>>> for x, y in list1:
d[x] = d.get(x, 0) + y
>>> d
{0: 7, 2: 1, 3: 6}