Как я могу разделить словарь Python с несколькими значениями текстового списка, чтобы иметь отдельные словари ключей, которые имеют одинаковые значения? - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть словарь с целыми числами в качестве ключей и списками в качестве значений.Небольшой предварительный просмотр показан здесь.

{85992: ['teardrop', 'list2015'], 86107: ['teardrop', 'list2015'], 82364: ['macron', 'paris', 'palace'], 516253: ['liberia', 'vietnam'], 746235: ['democratic', 'national'], 861073: ['macron', 'paris', 'palace']}

Я хочу вывести ключи с одинаковыми значениями списка в одних и тех же словарях, чтобы составить CSV-файл для каждого отдельного набора значений, классифицируя ключи с одинаковыми значениями.У меня большой список, поэтому я не могу определить названия словаря, потому что я не знаю, сколько их будет.

Мне удалось отсортировать словарь с помощью панд для вывода отсортированного списка на основе текстов, но я не смог использовать панды для его разделения.

import pandas as pd

data_file = pd.DataFrame(key_dict).transpose().reset_index()
data_file.columns = ['name_id' , 'text']
data_file.groupby('text')
data_file.set_index('name_id', inplace = True)
data_file.to_csv('key_dict.csv')

Я думал овариант B, содержащий списки ключей, имена которых названы в соответствии с их уникальными значениями словаря (текстовые списки)Однако я предпочитаю разделенный словарь.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Использование map:

Вход

from collections import defaultdict
key_dict={85992: ['teardrop', 'list2015'], 86107: ['teardrop', 'list2015'], 82364: ['macron', 'paris', 'palace'], 516253: ['liberia', 'vietnam'], 746235: ['democratic', 'national'], 861073: ['macron', 'paris', 'palace']}
d = {}
d = defaultdict(lambda: [], d)
counts = map(lambda x: d[tuple(key_dict[x])].append(x) , key_dict.keys())
print(d['macron', 'paris', 'palace'])
d

Выход

[861073, 82364]
defaultdict(<function __main__.<lambda>>,
            {('democratic', 'national'): [746235],
             ('liberia', 'vietnam'): [516253],
             ('macron', 'paris', 'palace'): [861073, 82364],
             ('teardrop', 'list2015'): [85992, 86107]})
0 голосов
/ 26 ноября 2018

Вы можете использовать collections.defaultdict для решения O ( n ), не забывая использовать клавиши tuple, так как list не является хэшируемым:

from collections import defaultdict

d = {85992: ['teardrop', 'list2015'], 86107: ['teardrop', 'list2015'],
     82364: ['macron', 'paris', 'palace'], 516253: ['liberia', 'vietnam'],
     746235: ['democratic', 'national'], 861073: ['macron', 'paris', 'palace']}

dd = defaultdict(list)

for k, v in d.items():
    dd[tuple(v)].append(k)

print(dd)

defaultdict(list,
            {('democratic', 'national'): [746235],
             ('liberia', 'vietnam'): [516253],
             ('macron', 'paris', 'palace'): [82364, 861073],
             ('teardrop', 'list2015'): [85992, 86107]})

составьте файл CSV для каждого отдельного набора значений

Для этой части вашей проблемы просто выполните итерации defaultdict:

for k, v in dd.items():
    df = pd.DataFrame(v)
    df.to_csv('_'.join(k) + '.csv', index=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...