gpt4 book ai didi

python - 查找字典中混合类型值的重复项

转载 作者:太空宇宙 更新时间:2023-11-03 15:53:58 25 4
gpt4 key购买 nike

我想识别字典中的重复值并将其分组。为此,我构建了数据集的伪哈希(更好地读取签名),如下所示:

from pickle import dumps
taxonomy = {}
binder = defaultdict(list)
for key, value in ds.items():
signature = dumps(value)
taxonomy[signature] = value
binder[signature].append(key)

有关具体用例,请参阅此 question .

不幸的是,我意识到如果以下陈述为True:

>>> ds['key1'] == ds['key2']
True

这个不再总是True:

>>> dumps(ds['key1']) == dumps(ds['key2'])
False

我注意到两个字典的转储输出的键顺序不同。如果我将 ds['key1']ds['key2'] 的输出复制/粘贴到新词典我可以使比较成功。

作为一种过度杀伤的替代方案,我可以递归地遍历我的数据集并用 OrderedDict 替换 dict 实例:

import copy
def faithfulrepr(od):
od = od.deepcopy(od)
if isinstance(od, collections.Mapping):
res = collections.OrderedDict()
for k, v in sorted(od.items()):
res[k] = faithfulrepr(v)
return repr(res)
if isinstance(od, list):
for i, v in enumerate(od):
od[i] = faithfulrepr(v)
return repr(od)
return repr(od)

>>> faithfulrepr(ds['key1']) == faithfulrepr(ds['key2'])
True

我对这种幼稚的方法感到担心,因为我不知道我是否涵盖了所有可能的情况。

我可以使用什么其他(通用)替代方案?

最佳答案

第一件事是删除对 deepcopy 的调用,这是您的瓶颈:

def faithfulrepr(ds):
if isinstance(ds, collections.Mapping):
res = collections.OrderedDict(
(k, faithfulrepr(v)) for k, v in sorted(ds.items())
)
elif isinstance(ds, list):
res = [faithfulrepr(v) for v in ds]
else:
res = ds
return repr(res)

但是sortedrepr也有其缺点:

  1. 您无法真正比​​较自定义类型;
  2. 您不能使用具有不同类型键的映射。

所以第二件事是摆脱 faithfulrepr 并将对象与 __eq__ 进行比较:

binder, values = [], []
for key, value in ds.items():
try:
index = values.index(value)
except ValueError:
values.append(value)
binder.append([key])
else:
binder[index].append(key)
grouped = dict(zip(map(tuple, binder), values))

关于python - 查找字典中混合类型值的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40976060/

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