如何“映射”dict以仅更改Python中的值

时间:2011-11-24 08:41:58

标签: python functional-programming

我有这样的字典:

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

我有一个函数需要一个dict,其中键是食物类型,值是属于我想要的那种食物的数量,例如:

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

在这种情况下,我想要每种类型的食物数量相等,我将用常数表示。

有没有一种简单的方法可以通过获取food_to_food_type dict的值来创建新的dict,并将它们用作num_foods_of_type dict中的键,将每个值设置为常量?< / p>

这是我想要的行为:

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 dict转换为我的函数:

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

当然,我自己可以写magic_maplike_function,但肯定必须有Pythonic的方法才能做到这一点,对吗?

3 个答案:

答案 0 :(得分:4)

提出了一个很棒的解决方案here来计算python列表中出现的次数。 这适用于您的情况:

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) ) )

答案 1 :(得分:2)

您可以通过这种方式实现所需:

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

答案 2 :(得分: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)