2011-11-24 76 views
2

只值我有這樣一個字典:我怎樣才能「地圖」的字典來改變在Python

food_to_food_type = {"apple": "fruit", "green bean": "vegetable", "tomato": "controversial"} 

我想要一個字典,其中鍵是食物的種類和值數的函數屬於這種類型的,我想,例如食品:

num_foods_of_type = {"fruit": 1, "vegetable": 1, "controversial": 1} 

在這種情況下,我想的每種類型的,我將在以恆定的代表食品相等數目。

有沒有一種簡單的方法,採取我food_to_food_type字典的值,並利用他們在我的字典num_foods_of_type按鍵,每個值設置爲我不斷作出新的字典?

這是我想要的行爲:

NUM_FOODS_DESIRED = 1 
num_foods_of_type = {} 
for food_type in food_to_food_type.values(): 
    num_foods_of_type[food_type] = NUM_FOODS_DESIRED 

但我想這樣做的功能時尚這樣我就可以改造food_to_food_type字典的方式進入我的功能:

order_food_types(magic_maplike_function(food_to_food_type.values(), NUM_FOODS_DESIRED)) 

中當然,我自己也可以寫magic_maplike_function,但肯定會有一種Pythonic方式來做到這一點,對吧?

回答

4

一個美妙的解決方案,提出了here算在Python列表occurence的數量。 Apparantly

values = food_to_food_type.values() 
dict(zip(values, map(values.count, values))) 

,我還沒有看過你的問題千萬要小心: 這可以適用於你的情況。你的意思是這樣的:

values = food_to_food_type.values() 
dict(zip(values, [NUM_FOOD_TYPES]*len(values))) 
+0

我接受Cédric的這個答案僅僅是因爲計算事件的形式也是非常有用的,即使它不是我在這種情況下所需要的。謝謝! –

2

你可以達到你所需要的是這樣的:

dict(zip(food_to_food_type.values(), food_to_food_type.values()*[NUM_FOODS_DESIRED])) 
>>> {'vegetable': 1, 'fruit': 1, 'controversial': 1} 
+0

字典(郵政編碼(food_to_food_type.values(),LEN(food_to_food_type.values())* [NUM_FOODS_DESIRED])(?) )準確地說是 – soulcheck

+0

,並且可能是最pythonic的方式是字典(zip(food_to_food_type.itervalues(),len(food_to_food_type)* [NUM_FOODS_DESIRED])) – soulcheck

+0

根據[本文](http://docs.python.org /dev/whatsnew/2.7.html#pep-3106-dictionary-views)'iteritems()','iterkeys()'和'itervalues()'不再需要(可能)Python 2.7並在Python 3.x中刪除。另見[本文](http://www.python.org/dev/peps/pep-3106/)。 – moooeeeep

1
>>> help(dict.fromkeys) 
Help on built-in function fromkeys: 

fromkeys(...) 
    dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v. 
    v defaults to None. 

因此,

dict.fromkeys(food_to_food_type.values(), NUM_FOODS_DESIRED)