【问题标题】:How can I split a python dictionary with multiple text-list values to have separate dictionaries of keys that have the same values?如何拆分具有多个文本列表值的 python 字典以具有具有相同值的单独键的字典?
【发布时间】:2019-04-28 01:24:17
【问题描述】:

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

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

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

我设法使用 pandas 对字典进行排序,以输出基于文本的排序列表,但我无法使用 pandas 将其拆分。

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

【问题讨论】:

    标签: python pandas list csv dictionary


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        • 2019-11-18
        相关资源
        最近更新 更多