gpt4 book ai didi

python - 如何从具有多个对象的 python 字典中获取重复对象的总数和相应的键?

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:07 24 4
gpt4 key购买 nike

我有一个由许多嵌套字典组成的 python 字典。 IE。它看起来像这样:

result = {
123: {
'route1': 'abc'
'route2': 'abc1'
},
456: {
'route1': 'abc'
'route2': 'abc1'
},
789: {
'route1': 'abc2'
'route2': 'abc3'
},
101: {
'route1': 'abc'
'route2': 'abc1'
},
102: {
'route1': 'ab4'
'route2': 'abc5'
}

这里我们可以看到123456101具有相同的值。我想要做的是找出重复的对象,在这种情况下是:

{
'route1': 'abc'
'route2': 'abc1'
}

以及具有此重复对象的键,即 123456101。我们如何做到这一点?

除了重复的对象信息,我还想知道哪些对象不重复。 IE。 789 及其各自的对象和 102 及其各自的对象。

PS:请注意,我事先并不知道哪些对象在重复,因为这个结构将在代码内部生成。因此,可能没有任何重复的对象,或者可能有多个,即不止一个。另外,由于某些限制,我不能使用 pandasnumpy 等。

最佳答案

您可以通过创建一个字典来实现这一点,该字典包含您的 result 字典(其中值本身就是字典)中每个不同值的所有匹配键。这是 Python 中相当常见的模式,遍历一个容器并将值聚合到字典中。然后,一旦创建了聚合字典,就可以将其拆分为重复值和单个值。

要构建聚合字典,您需要将 result 中的每个子字典用作键,并将原始字典中的匹配键附加到与该子字典关联的列表中。挑战在于您不能直接将子字典用作字典键,因为它们不可散列。但是您可以通过将它们转换为元组来解决这个问题。元组也应该排序,以避免遗漏以不同顺序弹出的重复项。

看一些示例代码可能更容易理解:

result = {
123: {'route1': 'abc', 'route2': 'abc1'},
456: {'route1': 'abc', 'route2': 'abc1'},
789: {'route1': 'abc2', 'route2': 'abc3'},
101: {'route1': 'abc', 'route2': 'abc1'},
102: {'route1': 'ab4', 'route2': 'abc5'}
}

# make a dict showing all the keys that match each subdict
cross_refs = dict()
for key, subdict in result.items():
# make hashable version of subdict (can't use dict as lookup key)
subdict_tuple = tuple(sorted(subdict.items()))
# create an empty list of keys that match this val
# (if needed), or retrieve existing list
matching_keys = cross_refs.setdefault(subdict_tuple, [])
# add this item to the list
matching_keys.append(key)

# make lists of duplicates and non-duplicates
dups = {}
singles = {}
for subdict_tuple, keys in cross_refs.items():
# convert hashed value back to a dict
subdict = dict(subdict_tuple)
if len(keys) > 1:
# convert the list of matching keys to a tuple and use as the key
dups[tuple(keys)] = subdict
else:
# there's only one matching key, so use that as the key
singles[keys[0]] = subdict

print(dups)
# {
# (456, 123, 101): {'route2': 'abc1', 'route1': 'abc'}
# }
print(singles)
# {
# 789: {'route2': 'abc3', 'route1': 'abc2'},
# 102: {'route2': 'abc5', 'route1': 'ab4'}
# }

关于python - 如何从具有多个对象的 python 字典中获取重复对象的总数和相应的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57321373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com