为了账号安全,请及时绑定邮箱和手机立即绑定

通过python中的键对多维数组进行分组

通过python中的键对多维数组进行分组

一只甜甜圈 2021-05-04 10:24:21
我有这个代码: [    {        "info": {            "a": 65535,            "b": 50,        },        "test": {            "m": "10300",            "id": "2008",        },    },    {        "info": {            "a": 65535,            "b": 50,        },        "test": {            "m": "10300",            "id": "2008",        },    },    {        "info": {            "a": 65535,            "b": 50,        },        "test": {            "m": "10300",            "id": "2009",        },    },]我希望有 :[    "2008" : [        {            "info": {                "a": 65535,                "b": 50,             },            "test": {                "m": "10300",                "id": "2008",             },        },        {            "info": {                "a": 65535,                "b": 50,            },            "test": {                "m": "10300",                "id": "2008",            },       },    ]    "2009" : [        {            "info": {                "a": 65535,                "b": 50,            },            "test": {                "m": "10300",                "id": "2009",            },        },     ]想法是基于列ID按键值分组。我是python的新手,不知道该怎么做。请帮我。提前谢谢。如果您能提供一些想法,那就太好了。我找到了一些示例,但无论如何还是不能解决这个问题。我的解决方案:value = [i for i in array]res = sorted(value, key=lambda x: x["id"], reverse=True)
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

我认为您想要一个dictionary每个键都为id且值是您的对象的地方。


尝试以下方法。data是您的数据数组。


new = {}

for item in data:

    item_id = item['test']['id']

    new[item_id] = item

您还可以使用字典理解。


new = {item['test']['id']: item for item in data}


查看完整回答
反对 回复 2021-05-25
?
慕森王

TA贡献1777条经验 获得超3个赞

用 itertools.groupby


from itertools import groupby

f = lambda d: d['test']['id']

res = {k:list(v) for k,v in groupby(sorted(l, key=f), f)}

pprint(res)

输出


{'2008': [{'info': {'a': 65535, 'b': 50},

           'test': {'id': '2008', 'm': '10300'}},

          {'info': {'a': 65535, 'b': 50},

           'test': {'id': '2008', 'm': '10300'}}],

 '2009': [{'info': {'a': 65535, 'b': 50},

           'test': {'id': '2009', 'm': '10300'}}]}


查看完整回答
反对 回复 2021-05-25
?
波斯汪

TA贡献1811条经验 获得超4个赞

让我们假设


array = [

   {

    "info": {

        "a": 65535,

        "b": 50,

        },

    "test": {

        "m": "10300",

        "id": "2008",

        },

    },

    {

    "info": {

        "a": 65535,

        "b": 50,

        },

    "test": {

        "m": "10300",

        "id": "2008",

        },

    },

    {

    "info": {

        "a": 65535,

        "b": 50,

        },

    "test": {

        "m": "10300",

        "id": "2009",

        },

    },

]

然后您可以通过使用获得预期的结果


modified_data = {}

for entry in array:

    index = entry['test']['id']

    try:

        modified_data[index].append(entry)

    except KeyError:

        modified_data[index] = [entry]

print modified_data

现在让我们分析您的代码


value = [i for i in array]

此后的值将等于数组本身,假设您的数组初始化与我的相同。


res = sorted(value, key=lambda x: x["id"], reverse=True)

如果上面的语句正确,则value将没有“ id”,因此将引发错误。


此外,列表不能具有键值对。您必须为此使用字典。


查看完整回答
反对 回复 2021-05-25
  • 3 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信