【问题标题】:List comprehension vs dictionary comprehension列表理解与字典理解
【发布时间】:2018-11-27 18:01:38
【问题描述】:

各位晚安,

我有以下代码“就地”修改字典值

translate1 = {k:(0 if v > 300 and v < 900 else v) for k, v in translate1.items()}
translate1 = {k:(1 if v > 1400 and v < 2100 else v) for k, v in translate1.items()}
translate1 = {k:(2 if v > 8700 and v < 9100 else v) for k, v in translate1.items()}
translate1 = {k:(3 if v > 3800 and v < 4100 else v) for k, v in translate1.items()}
translate1 = {k:(4 if v > 6400 and v < 7000 else v) for k, v in translate1.items()}

我的问题是,可以通过列表理解实现类似的目标吗?我希望所有值都在同一个列表中按顺序排列。

提前致谢

【问题讨论】:

  • 实际上并没有“就地”完成。创建一个匿名字典,然后分配与您开始时相同的名称。此外,与其运行类似的字典理解 5 次,为什么不使用查找函数来分配值 0-4?
  • 你可以做列表推导,是的。您能否向我们展示您的预期结果的示例?
  • 我认为理解在这里不是一个理想的工具。使用正常的循环,因为你有太多的条件。
  • 这里没有就地修改。

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


【解决方案1】:

List comps 不是万灵药,您需要的是查找以将所有 items() 的迭代次数减少 5 次至 1 次:

def mapper(v):
    if 300 < v < 900:   # syntactical equivalent to v > 300 and v < 900
        return 0
    if 1400 < v < 2100:
        return 1
    if 8700 < v < 9100:
        return 2
    if 3800 < v < 4100:
        return 3
    if 6400 < v < 7000:
        return 4
    return v


translate1 = {k:mapper(v) for k, v in translate1.items()} 

您遗漏了一些价值观 - 我希望这是故意的。

【讨论】:

  • 是的,这是故意的。未知数预计在指定的范围内。不过还是谢谢你,很有帮助。也有助于了解他的语法变化,我想这就是通过谷歌搜索学习的诅咒。另外我想我应该更清楚,字典中的值存在于上述代码之前,它们都是指定范围内的变体,但不确定哪个键将包含什么范围值。
【解决方案2】:

我会这样写你的函数:

def mapper(v):
    di={
        (300,900):      0,
        (1400,2100):    1,
        (8700,9100):    2,
        (3800,4100):    3,
        (6400,7000):    4
    }
    for (t0,t1),ret in di.items():
        if t0<v<t1: return ret 
    return v

translate1={k:mapper(v) for k,v in translate1.items()}

除了 mapper 函数作为元组字典的形式之外,这与 Patrick Artner 的回答没有实质不同。

其他几个cmets:

  1. di={k:f(v) for k,v in di.items()} 表单di 上进行就地更新。相反,字典理解首先创建一个新的匿名字典,然后在完成后将该字典分配给名称di。主要问题(也许)是这样做的内存要求至少是原地分配的 2 倍。
  2. 具有理解的“就地”更新的唯一形式是:
    1. 使用切片分配li[:]=[list comprehension]
    2. .update 与字典理解一起使用di.update({dict comprehension on a subset of di})
  3. 使用列表推导而不是字典推导来创建字典没有任何优势。
  4. 字典在 Python 3.6+ 上只有任何“顺序”。在这种情况下,他们使用插入顺序。

【讨论】:

    猜你喜欢
    • 2021-03-05
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    相关资源
    最近更新 更多