0

我认为我想做的事情很容易,但我不知道正确的方法。

我有一个清单:

[
        {
            "id": 16,
            "condition": true,
            "tags": 6,
        },
        {
            "id": 16,
            "condition": true,
            "tags": 1,
        },
        {
            "id": 16,
            "condition": true,
            "tags": 4,
        },
        {
            "id": 3,
            "condition": false,
            "tags": 3,
        }
    ]

我想通过 id 和条件对 list 的元素进行分组,输出将是:

[
        {
            "id": 16,
            "condition": true,
            "tags": [6, 1, 4],
        },
        {
            "id": 16,
            "condition": false,
            "tags": [3],
        }
    ]

我可以通过循环我的列表并创建另一个数组来做到这一点,但我想知道一个更好的方法来做到这一点。

现在我的代码是这样的:

def format(self):
    list_assigned = the_list_I_want_to_modify
    res = []
    for x in list_assigned:
        exists = [v for v in res if
                             v['id'] == x['id'] and v['condition'] == x['condition']]
        if not exists:
            x['tags'] = [x['tags']]
            res.append(x)
        else:
            exists[0]['tags'].append(x['tags'])
    return res

谢谢

4

1 回答 1

1

可能有一个更漂亮的解决方案,但您可以通过首先创建一个临时字典来解决它,其中的键是包含原始列表中需要分组的所有键的元组,并将其附加到tags列表中 - 我使用.setdefault(key, type)字典功能使用默认列表元素制作字典。

然后,您可以使用列表理解再次将该字典解压缩到列表中。

a = [
        {
            "id": 16,
            "condition": True,
            "tags": 6,
        },
        {
            "id": 16,
            "condition": True,
            "tags": 1,
        },
        {
            "id": 16,
            "condition": True,
            "tags": 4,
        },
        {
            "verified_by": 3,
            "condition": False,
            "tags": 3,
        }
    ]

tmp = {}
for elem in a:
    groupby_keys = tuple(sorted((k, v) for k, v in elem.items() if k != 'tags'))
    tmp.setdefault(groupby_keys, []).append(elem['tags'])
out = [{a[0]: a[1] for a in list(k) + [('tags', v)]} for k, v in tmp.items()]
print(out)

输出:

>>> out
[{'id': 16, 'condition': True, 'tags': [6, 1, 4]}, {'verified_by': 3, 'condition': False, 'tags': [3]}]
于 2022-02-25T09:50:53.097 回答