Есть ли способ составить список о подсчете встречаемости разных переменных для разных элементов в списке? - PullRequest
0 голосов
/ 16 мая 2018
sumlist = [
    ['a01', '01-24-2017', 's1'],
    ['a03', '01-24-2017', 's2'],
    ['a03', '09-24-2017', 's1'],
    ['a03', '10-23-2017', 's1'],
    ['a04', '11-01-2017', 's1'],
    ['a04', '11-02-2017', 's2'],
    ['a04', '11-03-2017', 's1'],
    ['a04', '01-01-2017', 's1']]

Это список списков, над которыми я работаю в настоящее время, и вопрос состоит в том, чтобы подсчитать вхождения s1 и s2 для каждого элемента (a01, a03, a04).Единственный известный мне способ - использовать count (), но он работает только для одного элемента.

После того, как я использовал Counter и default (Спасибо за помощь @JPP!):

d = defaultdict(Counter) for animal, date, station in sumlist: d[animal][station] += 1

Я получаю:

defaultdict(<class 'collections.Counter'>, {'a04': Counter({'s2': 5, 's1': 5}), 'a01': Counter({'s1': 2, 's2': 1}), 'a03': Counter({'s1': 6, 's2': 4})}

Есть числа вхождений, но есть ли способ сделать два словаря вроде:

{a01: number of occurrences of S1, a04: the number of occureneces of S1, a03: number of occurrences of S1} и такой же для S2?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Вы можете попробовать это.

{a:Counter(c[2] for c in l if c[0]==a) for a in set(map(itemgetter(0),l))}

То есть

>>> from collections import Counter
>>> from operator import itemgetter
>>> set(map(itemgetter(0),l)) #get the zeroth element to get the keys
set(['a03', 'a01', 'a04'])
>>> {a:0 for a in set(map(itemgetter(0),l))} #dict comprehension
{'a03': 0, 'a01': 0, 'a04': 0}
>>> {a:[c[2] for c in l if c[0]==a] for a in set(map(itemgetter(0),l))} #if the key matches then get the 2nd index
{'a03': ['s2', 's1', 's1'], 'a01': ['s1'], 'a04': ['s1', 's2', 's1', 's1']}
>>> {a:Counter(c[2] for c in l if c[0]==a) for a in set(map(itemgetter(0),l))}
{'a03': Counter({'s1': 2, 's2': 1}), 'a01': Counter({'s1': 1}), 'a04': Counter({'s1': 3, 's2': 1})}
0 голосов
/ 16 мая 2018

То, что вы ищете, это defaultdict из Counter объектов:

from collections import defaultdict, Counter

d = defaultdict(Counter)

for key, _, val in sumlist:
    d[key][val] += 1

print(d)

defaultdict(collections.Counter,
            {'a01': Counter({'s1': 1}),
             'a03': Counter({'s1': 2, 's2': 1}),
             'a04': Counter({'s1': 3, 's2': 1})})

Инвертировать key и val, если вы хотите, чтобы ваше значение было ключом:

d = defaultdict(Counter)

for key, _, val in sumlist:
    d[val][key] += 1

print(d)

defaultdict(collections.Counter,
            {'s1': Counter({'a01': 1, 'a03': 2, 'a04': 3}),
             's2': Counter({'a03': 1, 'a04': 1})})
...