【问题标题】:List comprehension, but for dictionaries?列表理解,但对于字典?
【发布时间】:2016-09-16 18:20:56
【问题描述】:

执行以下操作的更 Pythonic 方式?在此示例中,我尝试将 cmets(字典)构建为键值对,其中键是未修改版本,值是键作为 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 的方法。谢谢!

【问题讨论】:

    标签: python python-3.x list-comprehension dictionary-comprehension


    【解决方案1】:

    使用dict comprehension 而不是在for 循环中构建字典:

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

    【讨论】:

    • 另外,避免理解内置函数:dict(zip(subs['ALLOWED'], map(func, subs['ALLOWED']))) 不,不是更多的 Pythonic,只是一个选项。我想我更喜欢现实生活中的理解,这就是为什么这不是答案。 :-)
    • @ShadowRanger 一点也不差。虽然对于这个特定的用例不会有太大的不同,但我认为你的版本会比我的更好(虽然我还没有测试过)。虽然,正如你所说,当然不是更蟒蛇; )
    • 亚尔。我对我的“解决方案”的主要反对意见是它违反了 DRY(它查找 'ALLOWED' 两次);对于小的输入,你的肯定会赢,对于大的输入,我的可能会更快,但这可能无关紧要。
    【解决方案2】:

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

    此外,您可以使用 [::-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'}
    

    【讨论】:

      猜你喜欢
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多