无法保留字典列表中的项目(值),但适用于多个项目

时间:2015-12-15 10:35:43

标签: python python-3.x

我有下面的词典列表

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]

3 个答案:

答案 0 :(得分:2)

简单,只需遍历列表项并从dict到pid方法获取键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_]

答案 1 :(得分:1)

简单的方法,

>>> 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]

答案 2 :(得分:1)

您可以使用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]