Как мне сделать это с помощью списка Python? (Itemgetter?) - PullRequest
2 голосов
/ 05 февраля 2010
[{'id':44}, {'name':'alexa'},{'color':'blue'}]

Я хочу выбрать в списке все, что является «id». По сути, я хочу напечатать 44, так как это «id» в списке.

Ответы [ 6 ]

5 голосов
/ 05 февраля 2010

Странная структура данных ... Список словарей из одного элемента.

key = 'id'
l = [{'id':44}, {'name':'alexa'},{'color':'blue'}]

print [ x[key] for x in l if key in x ][0]

Предполагая, что вы можете положиться на то, что ключ присутствует только один раз ...

Возможно, вам следует сначала преобразовать список в словарь:

key = 'id'
l = [{'id':44}, {'name':'alexa'},{'color':'blue'}]

d = {}
for x in l:
    d.update(x)
print d[key]
4 голосов
/ 05 февраля 2010

Все остальные ответы решают вашу проблему, я просто предлагаю альтернативный способ сделать это.

Вместо list из dict с, где вы запрашиваете ключ и должны перебирать все list элементов, чтобы получить значения, просто используйте dict из list с. Каждый ключ будет отображаться в list значений (или только в одно значение, если все ваши dict имеют разные наборы ключей).

Итак,

data=[{'id':44}, {'name':'alexa'},{'color':'blue'}]

становится

data={'id':[44], 'name':['alexa'], 'color':['blue']}

и вы можете легко получить доступ к значению 'id', используя data['id'] (или data['id'][0], если вам нужно только одно значение).

Если все ваши ключи различны по dict s (как в вашем примере), вам даже не нужно иметь list s значений.

data={'id':44, 'name':'alexa', 'color':'blue'}

Это не только делает ваш код чище, но и ускоряет ваши запросы, которые больше не нужно повторять за list.

3 голосов
/ 05 февраля 2010

Вероятно, это лучшее решение:

>>> L = [{'id':44}, {'name':'alexa'},{'color':'blue'}]

>>> newd = {}
>>> for d in L:
...    newd.update(d)
>>> newd['id']
44
3 голосов
/ 05 февраля 2010

Вы можете сделать что-то вроде этого:

>>> KEY = 'id'
>>>
>>> my_list = [{'id':44}, {'name':'alexa'},{'color':'blue'}]
>>> my_ids = [x[KEY] for x in my_list if KEY in x]
>>> print my_ids
[44]

Это, очевидно, список значений, которые вы хотите. Затем вы можете распечатать их по мере необходимости.

2 голосов
/ 05 февраля 2010
 >>> from itertools import dropwhile
 >>> def find_value(l, key):
 ...    return dropwhile(lambda x: key not in x, l).next()[key]
 >>> find_value([{'id':44}, {'name':'alexa'},{'color':'blue'}], "id")

Это будет выполнять линейный поиск, но только до тех пор, пока элемент не будет найден.

Если вы хотите правильно обработать ошибку, используйте:

def find_value(l, key):
    try:
        return dropwhile(lambda x: key not in x, l).next()[key]
    except StopIteration:
        raise ValueError(key)
0 голосов
/ 05 февраля 2010
>>> L = [{'id':44}, {'name':'alexa'},{'color':'blue'}]
>>> newd=dict(d.items()[0] for d in L)
>>> newd['id']
44
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...