列表理解与字典理解

时间:2018-11-27 18:01:38

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

晚上好,

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

jdk-11.0.1

我的问题是,列表理解是否可以实现类似的目标?我希望所有值都在同一列表中。

预先感谢

2 个答案:

答案 0 :(得分:1)

List comps不能解决所有问题,您需要进行查找以减少将5遍迭代到1遍的所有item():

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()} 

您缺少一些价值观-我希望这是故意的。

答案 1 :(得分:1)

我会这样写你的函数:

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的回答没有实质区别。

其他评论:

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