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

时间:2018-08-14 08:27:09

标签: python python-2.7

我有以下代码:

 [
    {
        "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 个答案:

答案 0 :(得分:2)

我认为您想要一个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}

答案 1 :(得分:1)

使用Observable.forkJoin(this.cdsDataService.getServersForComponent(), this.cdsDataService.getComponentForServer()) .switchMap(([servers, components]) => { let observableBatch = components.map(comp => this.cdsDataService.getComponentLinks(comp.ID) .map(p => { this.componentLinkData = p.map(it => ({from: comp.ID, to: it.ID, color: "blue"})) })); return Observable.forkJoin(observableBatch) }) .subscribe(()=>{ SomeMethod(); })

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)

答案 2 :(得分:1)

让我们假设

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',因此将引发错误。

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