Python 从排序字典中获取唯一值

Python 从排序字典中获取唯一值,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我有一个如下所示的字典:,我想要一个具有唯一kbid值和最小距离值的新字典。新词典也必须按距离排序 {"0":{"distance":291.21,"kbid":"aa"}, "1":{"distance":296.23,"kbid":"xx"}, "2":{"distance":299.21,"kbid":"xx"}, "3":{"distance":299.23,"kbid":"zz"}, "4":{"distance":309.21,"kbid":"aa"}, "5":{"distance

我有一个如下所示的字典:,我想要一个具有唯一kbid值和最小距离值的新字典。新词典也必须按距离排序

{"0":{"distance":291.21,"kbid":"aa"},
"1":{"distance":296.23,"kbid":"xx"},
"2":{"distance":299.21,"kbid":"xx"},
"3":{"distance":299.23,"kbid":"zz"},
"4":{"distance":309.21,"kbid":"aa"},
"5":{"distance":310.23,"kbid":"yy"},
"6":{"distance":310.23,"kbid":"yy"}}
下面给出了上面的示例输出

{"0":{"distance":291.21,"kbid":"aa"},
"1":{"distance":296.23,"kbid":"xx"},
"2":{"distance":299.23,"kbid":"zz"},
"3":{"distance":310.23,"kbid":"yy"}}

代码是用python编写的。

这将满足您的需要。它首先检查重复的kbid条目,只存储重复项的最低值。然后创建一个有序字典,将“kbid”转换为距离对,按距离排序。然后将值放入一个普通字典中,其索引相对于有序字典中的位置

from collections import OrderedDict

dict = {"0":{"distance":291.21,"kbid":"aa"},
"1":{"distance":296.23,"kbid":"xx"},
"2":{"distance":299.21,"kbid":"xx"},
"3":{"distance":299.23,"kbid":"zz"},
"4":{"distance":309.21,"kbid":"aa"},
"5":{"distance":310.23,"kbid":"yy"},
"6":{"distance":310.23,"kbid":"yy"}}

# Check for duplicates.
kbid_dict = {}
for key, value in dict.items():
    if value.get("kbid") in kbid_dict:
        if value.get("distance") < kbid_dict[value.get("kbid")]:
            kbid_dict[value.get("kbid")] = value.get("distance")
    else:
        kbid_dict[value.get("kbid")] = value.get("distance")

# Create a sorted dictionary based on distance.
sorted_dict = OrderedDict(sorted(kbid_dict.items(), key=lambda t: t[1]))
# Put the values into a new dictionary with the required index.
final_dict = {}

for index, value in enumerate(sorted_dict):
    final_dict[index] = {"distance": sorted_dict[value], "kbid" : value}


在最后一行中。

使用
any
,并将
排序
,尽管此列表特定示例不需要排序,但这将适用于未排序的条件

d = {"0":{"distance":291.21,"kbid":"aa"},
"1":{"distance":296.23,"kbid":"xx"},
"2":{"distance":299.21,"kbid":"xx"},
"3":{"distance":299.23,"kbid":"zz"},
"4":{"distance":309.21,"kbid":"aa"},
"5":{"distance":310.23,"kbid":"yy"},
"6":{"distance":310.23,"kbid":"yy"}}


res = {}
d = dict(sorted(d.items(), key=lambda x: x[1]['distance']))

for k, v in d.items():
    if any(v['kbid'] in i.values() for i in res.values()):
        pass
    else:
        res[k] = v
print(res)
# {'0': {'distance': 291.21, 'kbid': 'aa'}, '1': {'distance': 296.23, 'kbid': 'xx'}, '3': {'distance': 299.23, 'kbid': 'zz'}, '5': {'distance': 310.23, 'kbid': 'yy'}}

到目前为止您尝试了什么?如果出现重复的
kbid
s,应该怎么做?对于具有相同
kbid
的项目,应保留哪些项目?或者它们应该以某种方式合并或求和?啊,
dict
s内部没有顺序,因此如果您想要“按距离排序的dict”,那么您应该查看
OrderedDict
(或者只是一个列表)
final_dict[str(index)]
d = {"0":{"distance":291.21,"kbid":"aa"},
"1":{"distance":296.23,"kbid":"xx"},
"2":{"distance":299.21,"kbid":"xx"},
"3":{"distance":299.23,"kbid":"zz"},
"4":{"distance":309.21,"kbid":"aa"},
"5":{"distance":310.23,"kbid":"yy"},
"6":{"distance":310.23,"kbid":"yy"}}


res = {}
d = dict(sorted(d.items(), key=lambda x: x[1]['distance']))

for k, v in d.items():
    if any(v['kbid'] in i.values() for i in res.values()):
        pass
    else:
        res[k] = v
print(res)
# {'0': {'distance': 291.21, 'kbid': 'aa'}, '1': {'distance': 296.23, 'kbid': 'xx'}, '3': {'distance': 299.23, 'kbid': 'zz'}, '5': {'distance': 310.23, 'kbid': 'yy'}}