Обновлять список словарей поэлементно в Python - PullRequest
0 голосов
/ 20 февраля 2012

Скажем, у нас есть список словарей в Python:

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

Мы выбираем значения 'x', используя map()

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

и сделай что-нибудь с ними. Теперь, что является самым чистым способом обновить все 'x' -значения A сопоставимым способом - т.е. без использования цикла for?

Ответы [ 5 ]

1 голос
/ 20 февраля 2012

В одну строку?

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

Где, в этом случае, вы увеличиваете значение X. Хотя я бы предположил, что это не самый красивый способ сделать что-либо и не самый читаемый. По крайней мере, выполняя метод обновления, вы не полагаетесь на «скрытый» внутренний тип, такой как setitem , и он немного более гибкий, так как вы можете вносить изменения более чем в один ключ за раз. 1006 *

1 голос
/ 20 февраля 2012
>>> 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» было действительно большим, а производительность - супер важной.

0 голосов
/ 20 февраля 2012

Если вы сначала извлекли все значения '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)
0 голосов
/ 20 февраля 2012

Пусть X будет списком обновленных значений для "x":

while X:
    A[len(X)]['x'] = X.pop()
0 голосов
/ 20 февраля 2012
>>> map((lambda i: i.__setitem__('x',10)), A)
[None, None]
>>> A
[{'y': 2, 'x': 10, 'z': 3}, {'y': 10, 'x': 10, 'z': 11}]

Но это безобразно.И я бы использовал цикл for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...