如何将具有多个文本列表值的python字典拆分为具有相同值的键的单独字典



我有一个字典,它把整数作为键,把列表作为值。此处显示了一个小预览。

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

我想在相同的字典中输出具有相同列表值的键,以便为每个单独的值集绘制一个CSV文件,对具有相似值的键进行分类。我有一个很大的清单,所以我不能定义字典的名字,因为我不知道应该有多少。

我设法用panda对字典进行了排序,以根据文本输出排序列表,但我无法用panda将其拆分。

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,即拥有键的列表,这些列表以其唯一的字典值(文本列表(命名。然而,我更喜欢的选择是拆分字典。

您可以将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)

使用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]})

最新更新