2012-03-15 71 views
0

對象:字典改造和反

data = [{'key': 11, 'country': 'USA'},{'key': 21, 'country': 'Canada'},{'key': 12, 'country': 'USA'}] 

的結果應該是:

{'USA': {0: {'key':11}, 1: {'key': 12}}, 'Canada': {0: {'key':21}}} 

我開始實驗:

result = {} 

for i in data: 
    k = 0 
    result[i['country']] = dict(k = dict(key=i['key'])) 

,我也得到:

{'Canada': {'k': {'key': 21}}, 'USA': {'k': {'key': 12}}} 

那麼我怎麼能把櫃檯代替k?也許有一種更優雅的方式來創建字典?

+0

爲什麼「加拿大」:{1:{'key':21}}'而不是'加拿大':{0:{'key':21}}? – 2012-03-15 19:34:59

+0

對不起,我犯了一個錯誤。固定。 – vlad 2012-03-15 19:36:46

+0

@vlad發佈您的解決方案,以便其他人可以獲得收益 – 2012-03-15 19:49:02

回答

3

我用現有的結果項的len()

>>> import collections 
>>> data = [{'key': 11, 'country': 'USA'},{'key': 21, 'country': 'Canada'},{'key': 12, 'country': 'USA'}] 
>>> result = collections.defaultdict(dict) 
>>> for item in data: 
...  country = item['country'] 
...  result[country][len(result[country])] = {'key': item['key']} 
... 
>>> dict(result) 
{'Canada': {0: {'key': 21}}, 'USA': {0: {'key': 11}, 1: {'key': 12}}} 

有可能是做一個更有效的方法這,但我認爲這將是最可讀的。

+1

'has_key'已被棄用。你應該使用'如果國家不在結果:'。另外,當你需要一個字典鍵的缺省值時,你應該使用'defaultdict',以便自動完成測試:'result = collections.defaultdict(dict)'。 – agf 2012-03-15 20:04:57

+0

感謝您的指點。編輯。 – zigg 2012-03-15 20:11:56

1

添加的號碼,使用{鍵:值}語法

result = {} 

for i in data: 
    k = 0 
    result[i['country']] = dict({k : dict(key=i['key'])}) 
+0

答案應該詳細.. – 2012-03-15 19:46:54

+2

這仍然沒有給出所需的答案 – agf 2012-03-15 19:52:56

2

@zigg's answer更好。
這裏的另一種方法:

import itertools as it, operator as op 

def dict_transform(dataset, key_name=None, group_by=None): 
    result = {} 
    sorted_dataset = sorted(data, key=op.itemgetter(group_by)) 
    for k,g in it.groupby(sorted_dataset, key=op.itemgetter(group_by)): 
     result[k] = {i:{key_name:j[key_name]} for i,j in enumerate(g)} 
    return result 

if __name__ == '__main__': 
    data = [{'key': 11, 'country': 'USA'}, 
      {'key': 21, 'country': 'Canada'}, 
      {'key': 12, 'country': 'USA'}] 
    expected_result = {'USA': {0: {'key':11}, 1: {'key': 12}}, 
        'Canada': {0: {'key':21}}} 

    result = dict_transform(data, key_name='key', group_by='country') 
    assert result == expected_result 
1
dict(k = dict(key=i['key'])) 

這通過i['key']key關鍵字參數到dict構造函數(這是你想要的 - 因爲該字符串"key"的結果被用作鍵),然後將結果作爲k關鍵字參數傳遞給dict構造函數(這不是您想要的) - 這就是參數傳遞在Python中的工作原理。事實上,你有一個名爲k的本地變量是無關緊要的。

爲了讓這裏的k值被用作鍵的字典,最簡單的方法是使用字典的文字語法:{1:2, 3:4}是其中關鍵1與價值2相關的字典,關鍵3與值4相關聯。注意,在這裏我們使用表達式作爲鍵和值 - 而不是名稱 - 因此我們可以使用局部變量,並且生成的字典將使用命名值。

因此,你想要{k: {'key': i['key']}}

也許有更優雅的方式來創建字典?

您可以通過追加項目來創建列表,然後將列表轉換爲包含dict(enumerate(the_list))的字典。這至少可以使您不必手動進行計數,但它非常間接。