2016-08-11 36 views
3

我有幾個方案,以創建一個新的字典另一詞典:創建字典從以最快的和可擴展的方式

  1. 只有把這些字典與關鍵「總」名單不是零
  2. 刪除鍵詞典如「總」和「排名」
  3. 使用「姓名」鍵值爲鍵和「遊戲」的鍵值爲新字典
  4. 排序值的新字典
  5. 名單
    值列表

我的代碼是:

# 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 builtin函數來處理這種情況?

回答

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}, 
] 

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']}這就是你要找的。

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}, 
    ] 
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']} 
0

,如果我理解您的需求不錯,這應該這樣做:

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} 
0

加入到其他的答案,如果你添加一個result_data={}for my_dict in dict_without_total:,它應該工作的罰款。

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

result_data是沒有得到在這問題每一次迭代重新初始化。

0

另一種解決方案:

要創建所需的字典:

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

你也可以去熊貓(另一種方法):

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

爲了鍵排序

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']} 
相關問題