【问题标题】:Create dictionary from another dictionary with the fastest and scalable way以最快和可扩展的方式从另一个字典创建字典
【发布时间】:2016-12-17 21:45:29
【问题描述】:

创建新字典的场景很少:

  1. 只取列表中键“total”不为零的字典
  2. 从字典中删除键,例如“total”和“rank”
  3. 使用 'name' 键值作为键,使用 'game' 键值作为列表
    新字典中的值
  4. 对新字典中的值列表进行排序

我的代码是:

# input dictionary
data =[
           {'name': 'foo', 'rank': 3, 'game': 'football', 'total': 1},
           {'name': 'bar', 'rank': 5, 'game': 'hockey', 'total': 0},
           {'name': 'foo', 'rank': 7, 'game': 'tennis', 'total': 0},
           {'name': 'foo', 'rank': 2, 'game': 'cricket', 'total': 2},
           {'name': 'bar', 'rank': 1, 'game': 'cricket', 'total': 8},
        ]

result_list = []
merged_data = {}
result_data = {}

# Get the list of dict if key 'total' value is not zero
dict_without_total = [
    den for den in data if den.get('total')
]

for my_dict in dict_without_total:

    # deleting key 'brand' and 'total' from the
    del my_dict['rank']
    del my_dict['total']

    result_data.update({
        my_dict.get('name'): (my_dict.get('game'))
    })
    result_list.append(result_data)

# store all values of same keys in list and sort the values list
for result in result_list:
    for keys, values in result.items():
        if keys not in merged_data:
            merged_data[keys] = []

        merged_data[keys].append(values)
        merged_data[keys].sort()

print merged_data

我的代码输出:

{
    'bar': ['cricket', 'cricket', 'cricket'],
    'foo': ['cricket', 'cricket', 'cricket']
}

预期结果:

{
   'foo': ['cricket', 'football'],
   'bar': ['cricket']
}

有没有更快的方法来获得结果,或者我可以使用一些 python 内置函数来处理这种情况?

【问题讨论】:

    标签: python python-2.7 python-3.x


    【解决方案1】:

    您可以真正简化此操作,因为无需修改现有字典。不理会原始数据结构并构建一个新的数据结构通常要干净得多。

    data = [
        {'name': 'foo', 'rank': 3, 'game': 'football', 'total': 1},
        {'name': 'bar', 'rank': 5, 'game': 'hockey', 'total': 0},
        {'name': 'foo', 'rank': 7, 'game': 'tennis', 'total': 0},
        {'name': 'foo', 'rank': 2, 'game': 'cricket', 'total': 2},
        {'name': 'bar', 'rank': 1, 'game': 'cricket', 'total': 8},
    ]
    
    result = {}
    
    for e in data:
        if e["total"]:
            name = e["name"]
            if name not in result:
                result[name] = []
            result[name].append(e["game"])
    
    print result
    

    结果是{'foo': ['football', 'cricket'], 'bar': ['cricket']},这就是您要查找的内容。

    【讨论】:

      【解决方案2】:

      你可以试试:

      data =[
             {'name': 'foo', 'rank': 3, 'game': 'football', 'total': 1},
             {'name': 'bar', 'rank': 5, 'game': 'hockey', 'total': 0},
             {'name': 'foo', 'rank': 7, 'game': 'tennis', 'total': 0},
             {'name': 'foo', 'rank': 2, 'game': 'cricket', 'total': 2},
             {'name': 'bar', 'rank': 1, 'game': 'cricket', 'total': 8},
          ]
      final_dict={}
      for single_data in data:
          if single_data['total'] > 0:
              if single_data['name'] in final_dict:
                  final_dict[single_data['name']].append(single_data['game'])
              else:
                  final_dict[single_data['name']]=[single_data['game']]
      
      print final_dict
      

      输出:

      {'foo': ['football', 'cricket'], 'bar': ['cricket']}
      

      【讨论】:

        【解决方案3】:

        另一种解决方案:

        创建你想要的字典:

        from collections import defaultdict
        d2 = defaultdict(set)
        [d2[d["name"]].add(d["game"]) for d in data if d["total"] > 0]
        

        对键进行排序:

        for key in d2.keys():   d2[key] = sorted(list(d2[key]))
        

        【讨论】:

          【解决方案4】:

          除了其他答案,如果您在for my_dict in dict_without_total: 中添加result_data={},它应该可以正常工作。

          for my_dict in dict_without_total:
              result_data={}
              ....rest of the code...
          

          result_data 在每次迭代时都没有重新初始化,这是问题所在。

          【讨论】:

            【解决方案5】:

            如果我能很好地理解您的要求,应该这样做:

            names = set(x['name'] for x in data)
            {name: sorted(list(set(x['game'] for x in data if (x['total']>0 and x['name']==name)))) for name in names}
            

            【讨论】:

              【解决方案6】:

              你也可以选择 pandas(替代方法):

              import pandas as pd
              
              df = pd.DataFrame([i for i in data if i['total']])
              
              {k: g['game'].tolist() for k,g in df.groupby('name')}
              #Out[178]: {'bar': ['cricket'], 'foo': ['football', 'cricket']}
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-03-09
                • 2022-10-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-05-15
                • 2021-04-17
                相关资源
                最近更新 更多