python - 如何通过值比较字典列表的元素并在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。
解决方案
这里的总体思路是创建一个“桶”列表,按值对它们进行排序,然后迭代地组合足够接近的相邻桶。
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']]