【问题标题】:Dictionary comprehension to avoid lines of code字典理解以避免代码行
【发布时间】:2014-06-09 21:52:36
【问题描述】:

您好想了解如何使用字典理解来缩短这段代码:

for e in list_of_tuples:
            tmp = mydict.copy()
            tmp[e[0]] = tmp[e[1]]
                if someFunction(tmp):
                    mydict = tmp

我想将字典理解传递给someFunction,而不是依赖于其值在循环中更改的临时字典。有可能吗?

【问题讨论】:

  • 这段代码有效吗?你能解释一下你想做什么吗?
  • 您将tmp 用于两个 事物:传递给someFunction,然后将mydict 绑定到它。绑定有什么用?
  • 抱歉,发现我误解了你的问题。
  • 我想我在这里看到了你想要的东西;您想从字典理解构建mydict,但只能使用使 whole 字典处于一致状态的键。这可能行不通,因为someFunction 想要访问 partially 构造的字典,这在 dict 理解中不可用。

标签: python dictionary dictionary-comprehension


【解决方案1】:

此答案假定 someFunction 不会改变字典

传递给someFunction 的字典仍将是mydict 的基本副本,但这是我能想到的以理解方式回答问题的唯一方法。

for e in list_of_tuples:
    if someFunction({key: val if key != e[0] else mydict[e[1]] for key,val in mydict }):
        mydict[e[0]] = mydict[e[1]]

然而,更快/更简单的方法是为mydict[e[0]] 创建一个临时变量,并在someFunction 失败后将其更改回来。也有额外的线路并不总是一件坏事。它通常可以帮助提高可读性、解决错误和维护.. 特别是对于新程序员。

for e in list_of_tuples:
    temp = mydict[e[0]]
    mydict[e[0]] = mydict[e[1]]
    if not someFunction(mydict):
        mydict[e[0]] = temp

【讨论】:

  • 如果e[0] 始终是一个字符串,那么这里的dict理解就有点过分了; dict(mydict, **{e[0]: e[1]}) 会实现同样的效果。
  • @Martijn Pieters,我完全同意。但是如果我们不知道键的数据类型,那它怎么能被创建为一个单行呢?
  • 在这种情况下这是什么**语法?
  • @Jasper ** 用于扩展地图/字典,通常用于关键字参数。* 用于列表。即*(a, b) -> a,b, **{'a':1,'b':2} -> a = 1, b = 2 在此处阅读以了解其在 dict docs.python.org/2/library/stdtypes.html#mapping-types-dict 中的用途
猜你喜欢
  • 2017-11-10
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
相关资源
最近更新 更多