在Python中以元素方式更新字典列表

时间:2012-02-20 18:21:47

标签: python list dictionary

假设我们在Python中有一个词典列表:

A = [{'x': 1, 'y': 2, 'z': 3},{'x': 0, 'y': 10, 'z': 11}]

我们使用map()

选出'x'值
x = map((lambda i: i['x']), A)

并与他们做点什么。现在,以类似方式更新'x'的所有A - 值的最简洁方法是什么 - 即,不使用for循环?

5 个答案:

答案 0 :(得分:1)

>>> r = [{'x': 1, 'y': 2, 'z': 3},{'x': 0, 'y': 10, 'z': 11}]
>>> r
[{'y': 2, 'x': 1, 'z': 3}, {'y': 10, 'x': 0, 'z': 11}]

>>> [i.__setitem__('x', 10) for i in r]
[None, None]
>>> r
[{'y': 2, 'x': 10, 'z': 3}, {'y': 10, 'x': 10, 'z': 11}]

这并不可怕,但我认为for循环会更好。如果'r'非常大并且性能非常重要,我只会这样做。

答案 1 :(得分:1)

单行?

map(lambda (i,v) : A[i].update(v), enumerate(map((lambda i: {'x':i['x'] + 1}), A)))

在这种情况下,你在增加X的值。虽然我建议这不是最好的方式做任何事情,也不是最可读的。至少通过执行更新方法,您不依赖于像 setitem 这样的“隐藏”内部,并且它可以更灵活一点,因为您可以一次更改多个键。

答案 2 :(得分:0)

>>> map((lambda i: i.__setitem__('x',10)), A)
[None, None]
>>> A
[{'y': 2, 'x': 10, 'z': 3}, {'y': 10, 'x': 10, 'z': 11}]

但这很难看。我会使用for循环。

答案 3 :(得分:0)

X成为“x”的更新值列表:

while X:
    A[len(X)]['x'] = X.pop()

答案 4 :(得分:0)

如果您首先将所有'x'值提取到list中,如图所示,您可以像这样更新它们:

A = [{'x': 1, 'y': 2, 'z': 3},{'x': 0, 'y': 10, 'z': 11}]

x = map((lambda i: i['x']), A)

def do_something(x):
    return x+1

print A
# [{'y': 2, 'x': 1, 'z': 3}, {'y': 10, 'x': 0, 'z': 11}]

map((lambda i,v: i.__setitem__('x', do_something(v))), A, x)

print A
# [{'y': 2, 'x': 2, 'z': 3}, {'y': 10, 'x': 1, 'z': 11}]

然而,使用以下内容可以更有效地获得相同的结果,不需要将所有'x'值首先提取到单独的列表中:

map((lambda i: (i.__setitem__('x', do_something(i['x'])))), A)