【问题标题】:Create a dictionary based on same key pairs from dictionary inside a list根据列表中的字典中的相同键对创建字典
【发布时间】:2018-08-07 11:09:43
【问题描述】:

我在列表中的字典为:

 [{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'muv'},
 {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'hatchback'},
 {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'suv'},
 {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'sedan'},
 {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'coupe'},
 {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'electric'},
 {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'diesel'},
 {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'cng'},
 {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'petrol'}]

我想将键 keywords 的值存储到字典中,以获取键 c1c2 的同一对值,键的名称为 c1#c2。所以预期的输出是这样的:

cars= {'Cars#Class':
['muv','hatchback','suv','sedan','coupe'],
'Cars#FuelType':
['electric','diesel','cng','petrol']}

所以当我使用cars['Cars#Class'] 时,我会得到['muv','hatchback','suv','sedan','coupe']

【问题讨论】:

  • 到目前为止你写了什么代码?

标签: python arrays python-3.x list dictionary


【解决方案1】:

默认字典

您可以将collections.defaultdict 与迭代一起使用。给定一个输入字典列表L

from collections import defaultdict

d = defaultdict(list)

for i in L:
    d[i['c1'].strip()+'#'+i['c2']].append(i['keywords'])

结果:

print(d)

defaultdict(list,
            {'Cars#Class': ['muv', 'hatchback', 'suv', 'sedan', 'coupe'],
             'Cars#FuelType': ['electric', 'diesel', 'cng', 'petrol']})

【讨论】:

    【解决方案2】:

    熊猫

    如果您乐于使用第三方库,您可以使用 Pandas。 pd.DataFrame 构造函数直接接受字典列表。给定一个输入列表L

    import pandas as pd
    
    df = pd.DataFrame(L)
    
    d = df.groupby(df['c1'].str.strip()+'#'+df['c2'])['keywords']\
          .apply(list).to_dict()
    
    print(d)
    
    {'Cars#Class': ['muv', 'hatchback', 'suv', 'sedan', 'coupe'],
     'Cars#FuelType': ['electric', 'diesel', 'cng', 'petrol']}
    

    【讨论】:

      【解决方案3】:

      您可以使用 itertools.goupby 来执行此操作。

      import itertools
      
      l = [{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'muv'},
       {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'hatchback'},
       {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'suv'},
       {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'sedan'},
       {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'coupe'},
       {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'electric'},
       {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'diesel'},
       {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'cng'},
       {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'petrol'}]
      
      
      result = {}
      for key, group in itertools.groupby(l, lambda x: "{}#{}".format(x['c1'].strip(), x['c2'].strip())):
          result[key] = map(lambda x: x['keywords'], list(group))
      
      print(result)
      

      【讨论】:

        【解决方案4】:
        result = {}
        for d in ld:
          val_c1 = d['c1']
          val_c2 = d['c2']
          val_key = d['keywords']
          combined_key = val_c1+'#'+val_c2
          if combined_key not in result:
            result[combined_key] = []
            result[combined_key].append(val_key)
          else:
            result[combined_key].append(val_key)
        

        【讨论】:

          【解决方案5】:

          使用itertools.groupby根据键'c2'的值对dicts进行分组,并从分组的dict中提取键keywords的值

          >>> lst = [{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'muv'}, {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'hatchback'}, {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'suv'}, {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'sedan'}, {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'coupe'}, {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'electric'}, {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'diesel'}, {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'cng'}, {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'petrol'}]
          >>> cars = {f'Cars#{k}':[d['keywords'] for d in v] for k,v in groupby(lst, lambda d: d['c2'])}
          >>> print(cars)
          {'Cars#Class': ['muv', 'hatchback', 'suv', 'sedan', 'coupe'], 'Cars#FuelType': ['electric', 'diesel', 'cng', 'petrol']}
          >>> print(cars['Cars#Class'])
          ['muv', 'hatchback', 'suv', 'sedan', 'coupe']
          >>> 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-05-25
            • 2019-02-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多