0

Более питонический способ сделать следующее? В этом примере я пытаюсь создать комментарии (a dict), чтобы быть парами ключ-значение, где ключ - это немодифицированная версия, а значение - это возвращаемое значение из функции, в которой ключ был передан как arg.Понимание списка, но для словарей?

def func(word): 
    return word[-1:-6:-1].upper() 

subs = { 
    'ALLOWED': ['one', 'two'], 
    'DISALLOWED': ['three', 'four'] 
} 

comments = {} 
for sub in subs['ALLOWED']: 
    # reverse and uppercase 
    comments[sub] = func(sub) 

print(comments) 

У кого-нибудь есть рекомендация? Не совсем важно, чтобы это было сделано, но мне нравится изучать идиомы python и способы сделать мой код более питоническим. Благодаря!

ответ

4

Используйте dict comprehension вместо создания вашего словаря в for цикле:

comments = {key: func(key) for key in subs['ALLOWED']} 
+1

В качестве альтернативы, избегая понимания для встроенного -ins: 'dict (zip (subs ['ALLOWED'], map (func, subs ['ALLOWED'])))' Нет, не более Pythonic, просто вариант. Думаю, я предпочел бы понимание в реальной жизни, поэтому это не ответ. :-) – ShadowRanger

+0

@ ShadowRanger не плохо. Хотя это не будет иметь большого значения для этого конкретного случая использования, я думаю, что ваша версия будет работать лучше, чем моя (хотя я еще не тестировал). Хотя, как вы сказали, конечно, не более pythonic;) – elethan

+0

Яр. Мое главное возражение против моего «решения» заключается в том, что он нарушает СУХОЙ (он дважды смотрит «ДОПУСКАЕТ»); для небольших входов, ваш, безусловно, победит, мой может быть тик быстрее для огромных ресурсов, но это, вероятно, не имеет значения. – ShadowRanger

0

Снимите петлю и заменить его внутри функции со словарем понимания. Затем вы можете просто вернуть его.

Кроме того, вы можете полностью изменить строку word с [::-1], а не сложный [-1:-6:-1] срез вы используете:

def func(words): 
    return {word: word[::-1].upper() for word in words} 

Это дает то же самое:

comments = func(subs['ALLOWED']) 
print(comments) 
# {'two': 'OWT', 'one': 'ENO'}