Python 列表理解,但字典?

Python 列表理解,但字典?,python,python-3.x,list-comprehension,dictionary-comprehension,Python,Python 3.x,List Comprehension,Dictionary Comprehension,一种更具python风格的方法来做以下事情?在本例中,我试图将注释(dict)构建为键-值对,其中键是未修改的版本,值是作为参数传递键的函数的返回值 def func(word): return word[-1:-6:-1].upper() subs = { 'ALLOWED': ['one', 'two'], 'DISALLOWED': ['three', 'four'] } comments = {} for sub in subs['ALLOWED']:

一种更具python风格的方法来做以下事情?在本例中,我试图将注释(dict)构建为键-值对,其中键是未修改的版本,值是作为参数传递键的函数的返回值

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的习惯用法和使代码更具python风格的方法。谢谢

使用,而不是在
for
循环中构建词典:

comments = {key: func(key) for key in subs['ALLOWED']}
使用而不是在
for
循环中构建词典:

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

移除循环并在函数内部用字典替换它。然后,您可以简单地返回它

此外,您还可以使用
[:-1]
反转字符串
word
,而不是使用的复杂
[-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'}

移除循环并在函数内部用字典替换它。然后,您可以简单地返回它

此外,您还可以使用
[:-1]
反转字符串
word
,而不是使用的复杂
[-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'}

或者,避免理解内置代码:
dict(zip(subs['ALLOWED'],map(func,subs['ALLOWED']))
No,不太像Pythonic,只是一个选项。我想我更喜欢现实生活中的理解,这就是为什么这不是一个答案。:-)@暗影游侠一点也不坏。虽然对于这个特定的用例来说,它不会有太大的区别,但我认为您的版本会比我的版本表现得更好(尽管我还没有测试)。虽然,正如你所说,肯定不是更像蟒蛇;)是的。我对我的“解决方案”的主要反对意见是它违反了DRY(它会查找两次
'ALLOWED'
);对于小的输入,你的肯定会赢,对于大的输入,我的可能会快一点,但这可能无关紧要。或者,避免理解内置内容:
dict(zip(subs['ALLOWED'],map(func,subs['ALLOWED']))
不,不是更多的Pythonic,只是一个选项。我想我更喜欢现实生活中的理解,这就是为什么这不是一个答案。:-)@暗影游侠一点也不坏。虽然对于这个特定的用例来说,它不会有太大的区别,但我认为您的版本会比我的版本表现得更好(尽管我还没有测试)。虽然,正如你所说,肯定不是更像蟒蛇;)是的。我对我的“解决方案”的主要反对意见是它违反了DRY(它会查找两次
'ALLOWED'
);对于小的输入,你的肯定会赢,而我的可能会比大的输入快一点点,但这可能无关紧要。