Python中按元素更新字典列表

Python中按元素更新字典列表,python,list,dictionary,Python,List,Dictionary,假设我们有一个Python词典列表: A = [{'x': 1, 'y': 2, 'z': 3},{'x': 0, 'y': 10, 'z': 11}] 我们使用map() 对他们做点什么。现在,以类似的方式更新A的所有'x'-值(即不使用for循环)的最干净的方法是什么 >>> map((lambda i: i.__setitem__('x',10)), A) [None, None] >>> A [{'y': 2, 'x': 10, 'z': 3}, {

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

A = [{'x': 1, 'y': 2, 'z': 3},{'x': 0, 'y': 10, 'z': 11}]
我们使用
map()

对他们做点什么。现在,以类似的方式更新
A
的所有
'x'
-值(即不使用for循环)的最干净的方法是什么

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

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

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

这并不可怕,但我认为for循环会更好。只有当r真的很大并且性能非常重要时,我才会这么做

在一行中

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

在本例中,您增加了X的值。尽管我认为这不是做任何事情的最漂亮的方式,也不是最可读的方式。至少通过使用更新方法,您不需要依赖“隐藏”的内部设置,如setitem,而且更灵活的是,您可以一次更改多个键。

如果您首先将所有“x”值提取到
列表中,如图所示,您可以这样更新它们:

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)

为什么不想使用循环?鉴于场景不可比较(映射列表与更新列表),我看不出不使用
for
循环有什么好处。不使用for循环的原因是:它是并行计算类的一部分。删除尽可能多的循环。。。谢谢你的回答!实际上,使用函数式编程范式不鼓励我们使用任何类型的循环。使用地图是解决这个问题的好办法。
map(lambda (i,v) : A[i].update(v), enumerate(map((lambda i: {'x':i['x'] + 1}), A)))
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}]
map((lambda i: (i.__setitem__('x', do_something(i['x'])))), A)