Mam dict takiego:

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

Mam funkcję, która chce dict, w których klucze są rodzaje żywności i wartości, są liczbą żywności należących do tego typu, który chcę, np.:

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

W tym przypadku chcę równą liczbę pokarmów każdego typu, który reprezentuję stałą.

Czy jest łatwy sposób, aby nowego dyktatu, biorąc podjęcie wartości mojego food_to_food_type i używa ich jako kluczy w moim {X1}} Dict, ustawiając wartości każdego stałego?

Oto zachowanie, które chcę:

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

Ale chcę to zrobić w funkcjonalnym modzie, więc mogę po prostu przekształcić dict food_to_food_type w drodze do mojej funkcji:

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

Oczywiście, że mogę sam pisać magic_maplike_function, ale na pewno musi być peythonic sposób, aby to zrobić, prawda?

2
Josh Glover 24 listopad 2011, 12:41

3 odpowiedzi

Najlepsza odpowiedź

Zaproponowano wspaniałe rozwiązanie Oto, aby policzyć liczbę występów w liście Python. Można to zastosować do Twojej sprawy:

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

Najwyraźniej nie przeczytałem twojego pytania wystarczająco ostrożnego. Oznaczasz coś takiego: (?)

values = food_to_food_type.values()
dict( zip( values, [NUM_FOOD_TYPES]*len(values) ) )
4
Community 23 maj 2017, 10:08

Możesz osiągnąć to, czego potrzebujesz w ten sposób:

dict(zip(food_to_food_type.values(), food_to_food_type.values()*[NUM_FOODS_DESIRED]))
>>> {'vegetable': 1, 'fruit': 1, 'controversial': 1}
2
Cédric Julien 24 listopad 2011, 08:46
>>> 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.

A zatem,

dict.fromkeys(food_to_food_type.values(), NUM_FOODS_DESIRED)
1
Karl Knechtel 24 listopad 2011, 11:16