Как сохранить несколько фрагментов информации в defaultdict - PullRequest
0 голосов
/ 30 мая 2020

У меня есть список, который я повторяю, чтобы подсчитать некоторые комбинации, и я хотел бы сохранить дополнительную информацию, помимо подсчетов. Counter или defaultdict хороши для подсчета, но я не уверен, как добавить дополнительную информацию. Например, если я складываю все списки длины 2 в моем столбце 'list_to_count', я могу сделать это:

import pandas as pd
from itertools import combinations
from collections import defaultdict

mydf = pd.DataFrame({'auxinfo': ['first', 'second', 'third'], 'list_to_count': [['apple', 'banana'], ['apple', 'banana', 'chicken'], ['apple']]})
print(mydf)
d=defaultdict(int)
for r in mydf.itertuples():
    combos = combinations(r.list_to_count, 2)
    for combo in combos:
        combo_name = ','.join(sorted(combo))
        d[combo_name] += 1
print(d)

Вот что я получаю:

auxinfo              list_to_count
0        first       [apple, banana]
1        second      [apple, banana, chicken]
2        third       [apple]
In [13]: d
Out[13]: defaultdict(int, {'apple,banana': 2, 'apple,chicken': 1, 'banana,chicken': 1})

Но я также хотел бы сохранить auxinfo, например, в списке, где желаемый результат будет выглядеть как

{'apple,banana': (2, ['first', 'second']), 'apple,chicken': (1, ['second']), 'banana,chicken': (1, ['second'])}

defaultdict может быть инициализирован как defaultdict(tuple), в котором я мог бы сохранить кортеж из (count, auxinfo_list), но сам auxinfo_list не defaultdict.

1 Ответ

1 голос
/ 30 мая 2020

Вы можете использовать dict.get() и установить значение по умолчанию на (0, []).

d = {}
for r in mydf.itertuples():
    combos = combinations(r.list_to_count, 2)
    for combo in combos:
        combo_name = ','.join(sorted(combo))
        count, auxinfo_list = d.get(combo_name, (0, []))
        d[combo_name] = (count + 1, auxinfo_list + [r.auxinfo])

for key, value in d.items():
    print(f'{key}:\t{value}')

Вывод:

apple,banana:   (2, ['first', 'second'])
apple,chicken:  (1, ['second'])
banana,chicken: (1, ['second'])
...