Python 从字典中获取值对

Python 从字典中获取值对,python,Python,重新编辑以使其更加清晰和简单 对于以下数据 [ { "name": "name1", "a_id": "12345", "b_id": "0d687c94c5f4" }, { "name": "name2", "a_id": "67890", "b_id": "0d687c94c5f4" }, { "name": "name3", "a_id": "23857", "b_id": "9ec34be3d535" }, {

重新编辑以使其更加清晰和简单

对于以下数据

[
{
    "name": "name1",
    "a_id": "12345",
    "b_id": "0d687c94c5f4"
},
{
    "name": "name2",
    "a_id": "67890",
    "b_id": "0d687c94c5f4"
},
{
    "name": "name3",
    "a_id": "23857",
    "b_id": "9ec34be3d535"
},
{
    "name": "name4",
    "a_id": "84596",
    "b_id": "9ec34be3d535"
},
{
    "name": "name5",
    "a_id": "d82ebe9815cc",
    "b_id": null
}
]
如何获得

基于“b_id”0d687c94c5f4:

基于“b_id”9ec34be3d535:

结果:

defaultdict(list,
            {'0d687c94c5f4': ['12345', '67890'],
             '9ec34be3d535': ['23857', '84596'],
             None: ['d82ebe9815cc']})

你的要求不是很清楚。。但我想你的意思是你想用一个不同的键重新组合json列表。。。您可以使用itertools来实现这一点

试试这个:

import itertools
for key, group in itertools.groupby(r, lambda item: item['b_id']):
       print 'b_id', key, [x['a_id'] for x in group]

b_id 0d687c94c5f4 ['12345', '67890']
b_id 9ec34be3d535 ['23857', '84596']
b_id None ['d82ebe9815cc']
或者以字典的形式

for key, group in itertools.groupby(r, lambda item: item['b_id']):
    print {key: [x['a_id'] for x in group]}

{'0d687c94c5f4': ['12345', '67890']}
{'9ec34be3d535': ['23857', '84596']}
{None: ['d82ebe9815cc']}

公布预期的最终结果result@RomanPerekhrest,我需要所有“a_id”12345678902385784596的值,但基于“b_id”。我面临的挑战是,对于某些“a_id”来说,“b_id”是相同的。这会在
response
上迭代
len(response)
次,只有在
b_id
上已经排序了响应时,这才有效。如果是的话,这确实是一个很好的解决方案。如何将数据转换为变量。如果我尝试“data={key:[x['a_id']for x in group]}”,它只存储循环中的最后一个值>>data>{None:['d82ebe9815cc']}data={key:[x['a_id']for x in group]}每次都会覆盖数据。。如果你想在最后储存一本字典-使用字典comprehension@MaartenFabr,即使响应不是按全部排序(如此处expamle中的json),它仍然可以工作,它会重新排序给定的字典列表(未分组或以任何顺序),并根据给定的groupby(r,lambda item:item['b_id'])对其进行重新分组条款提到每次
键更改时它都会创建一个新组,因此这可能有效,也可能无效,具体取决于数据
defaultdict(list,
            {'0d687c94c5f4': ['12345', '67890'],
             '9ec34be3d535': ['23857', '84596'],
             None: ['d82ebe9815cc']})
result = {
    item['b_id']: [
        subitem['a_id']
        for subitem in response
        if subitem['b_id'] == item['b_id']
    ]
    for item in response
}

print(result)

>>> {'9ec34be3d535': ['23857', '84596'], '0d687c94c5f4': ['12345', '67890'], None: ['d82ebe9815cc']}
import itertools
for key, group in itertools.groupby(r, lambda item: item['b_id']):
       print 'b_id', key, [x['a_id'] for x in group]

b_id 0d687c94c5f4 ['12345', '67890']
b_id 9ec34be3d535 ['23857', '84596']
b_id None ['d82ebe9815cc']
for key, group in itertools.groupby(r, lambda item: item['b_id']):
    print {key: [x['a_id'] for x in group]}

{'0d687c94c5f4': ['12345', '67890']}
{'9ec34be3d535': ['23857', '84596']}
{None: ['d82ebe9815cc']}