首页 > 解决方案 > 如何通过值比较字典列表的元素并在Python中提取匹配的键?

问题描述

我有一个字典列表,需要通过比较元素的值来对键进行分组,以获得具有接近值的键列表。

l = [{'a': [6], 'b': [7, 16], 'c': [13], 'd': [32]}, {'a': [9], 'b': [43], 'c': [44], 'd': [45, 52], 'e': [47], 'f': [48], 'g': [54]}]

输出示例:

l2 = [['a_b', 'b', 'c', 'd'], ['a', 'b_c_d_e_f', 'd_g']]

值之间的差异最大为 3。

标签: pythondictionary

解决方案


这里的总体思路是创建一个“桶”列表,按值对它们进行排序,然后迭代地组合足够接近的相邻桶。

from typing import Dict, List, Tuple


def make_buckets(d: Dict[str, List[int]]) -> List[str]:
    buckets = sorted(
        [([k], [i]) for k, v in d.items() for i in v], 
        key=lambda b: b[1][0]
    )
    Bucket = Tuple[List[str], List[int]]

    def merge(a: Bucket, b: Bucket) -> bool:
        if min(b[1]) - max(a[1]) > 2:
            return False
        a[0][:] = sorted(a[0] + b[0])
        a[1][:] = sorted(a[1] + b[1])
        buckets.remove(b)
        return True

    while True:
        for a, b in zip(buckets, buckets[1:]):
            if merge(a, b):
                break
        else:
            break
    return sorted("_".join(k) for k, _ in buckets)


dicts = [
    {'a': [6], 'b': [7, 16], 'c': [13], 'd': [32]},
    {'a': [9], 'b': [43], 'c': [44], 'd': [45, 52], 'e': [47], 'f': [48], 'g': [54]}
]

print([make_buckets(d) for d in dicts])

印刷:

[['a_b', 'b', 'c', 'd'], ['a', 'b_c_d_e_f', 'd_g']]

推荐阅读