У меня ниже список словарей

input=[{'pid': 66, 'ids': [{'stid': 20, 'st': 20}, {'stid': 21, 'st': 60}, {'stid': 22, 'st': 20}, {'stid': 23, 'st': 60}, {'stid': 24, 'st': 20}], 'count': 5}, {'pid': 27, 'ids': [{'stid': 20, 'st': 20}, {'stid': 22, 'st': 20}, {'stid': 23, 'st': 60}, {'stid': 24, 'st': 20}], 'count': 4}, {'pid': 29, 'ids': [{'stid': 20, 'st': 20}, {'stid': 24, 'st': 20}], 'count': 2}]

Я пытаюсь получить вывод, как показано ниже -

res = [66,27,29]

Res содержит значения pid в массиве.

Для этого я попробовал приведенный ниже код, чтобы получить только элемент 'pid' из ввода

fs_loc = []
for g, items in itertools.groupby(input, lambda x: (x['pid'])):
    fs_loc.append({ 'pid': g[0] })
print(fs_loc)

Это выдает ошибку int не является подпиской. Тот же код работает нормально, если я хочу сохранить pid, считайте - для этого ниже работает -

fs_loc = []
for g, items in itertools.groupby(input, lambda x: (x['pid'],x['count'])):
    fs_loc.append({ 'pid': g[0], 'count': g[1] })
print(fs_loc)

Как я могу получить массив значений pid?

res = [66,27,29]
0
Satheesh Panduga 15 Дек 2015 в 13:35

3 ответа

Лучший ответ

Просто, просто переберите элементы списка и получите значение ключа pid из dict через dict.get() метод.

>>> input_ =[{'pid': 66, 'ids': [{'stid': 20, 'st': 20}, {'stid': 21, 'st': 60}, {'stid': 22, 'st': 20}, {'stid': 23, 'st': 60}, {'stid': 24, 'st': 20}], 'count': 5}, {'pid': 27, 'ids': [{'stid': 20, 'st': 20}, {'stid': 22, 'st': 20}, {'stid': 23, 'st': 60}, {'stid': 24, 'st': 20}], 'count': 4}, {'pid': 29, 'ids': [{'stid': 20, 'st': 20}, {'stid': 24, 'st': 20}], 'count': 2}]
>>> [i['pid'] for i in input_]
[66, 27, 29]

Или

[i.get('pid') for i in input_]
2
Avinash Raj 15 Дек 2015 в 10:39

Вы можете использовать setdefault. Обратите внимание, что я изменил имя переменной вашего исходного списка на input_data. Не рекомендуется использовать input для имени переменной.

d = {}
for e in input_data:
    for i,j in e.items():
        d.setdefault(i, []).append(j)
res = d['pid']
print (res)

Выход:

[66, 27, 29]
1
Joe T. Boka 15 Дек 2015 в 10:52

Простой способ,

>>> data = [{'count': 5, 'pid': 66, 'ids': [{'stid': 20, 'st': 20}, {'stid': 21, 'st': 60}, {'stid': 22, 'st': 20}, {'stid': 23, 'st': 60}, {'stid': 24, 'st': 20}]}, {'count': 4, 'pid': 27, 'ids': [{'stid': 20, 'st': 20}, {'stid': 22, 'st': 20}, {'stid': 23, 'st': 60}, {'stid': 24, 'st': 20}]}, {'count': 2, 'pid': 29, 'ids': [{'stid': 20, 'st': 20}, {'stid': 24, 'st': 20}]}]
>>> map(lambda x: x['pid'], data)
[66, 27, 29]
1
Adem Öztaş 15 Дек 2015 в 10:56