0

执行以下操作的更多pythonic方法?在这个例子中,我试图将注释(字典)构建为键值对,其中键是未经修改的版本,并且该值是将键作为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成语以及使我的代码更加pythonic的方法。谢谢!

回答

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

Yar。我对我的“解决方案”的主要反对意见是它违反了DRY(它查找了两次“允许”)。对于小投入,你一定会赢,我的投资可能会更快,但它可能是无关紧要的。 – 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'}