Подтвердить что ты не робот

Подсчет количества вхождений в списке кортежей

Я новичок в 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
4b9b3361

Ответ 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}