如何在嵌套字典中查找重复项或重复项?

我有一个嵌套字典,我正在尝试在 in 中查找重复项。例如,如果我有:


dictionary = {'hello': 3 , 'world':{'this': 5 , 'is':{'a': 3, 'dict': None}}}

返回值类似于:


True

因为这本词典包含重复项。


我可以用普通字典很容易地做到这一点,我认为这也适用于这种情况:


dictionary = {'hello': 3 , 'world':{'this': 5 , 'is':{'a': 3, 'dict': None}}}

rev_dictionary = {}


for key, value in dictionary.items():

    rev_dictionary.setdefault(value, set()).add(key)

    print(rev_dictionary)


for key,values in dictionary.items():

    if len(values) > 1:

        values = True

    else:

        values = False

这会引发以下错误:


TypeError: unhashable type: 'dict'

我怎样才能让它工作?


谢谢您的帮助!


注意:如果可能,我更喜欢不使用库的解决方案


30秒到达战场
浏览 174回答 3
3回答

呼如林

我假设您是按值而不是按键定义重复项。在这种情况下,您可以使用(这里提到)来展平嵌套的字典def flatten(d):    out = {}    for key, val in d.items():        if isinstance(val, dict):            val = [val]        if isinstance(val, list):            for subdict in val:                deeper = flatten(subdict).items()                out.update({key + '_' + key2: val2 for key2, val2 in deeper})        else:            out[key] = val    return out然后检查条件v = flatten(d).values()len(set(v))!=len(v)结果为真

繁花不似锦

我写了一个简单的解决方案:dictionary = {'hello': 3 , 'world':{'this': 5 , 'is':{'a': 3, 'dict': None}}}def get_dups(a, values=None):    if values is None: values = []    if (a in values): return True    values.append(a)    if type(a) == dict:        for i in a.values():            if (get_dups(i, values=values)):                return True    return Falseprint(get_dups(dictionary))这个怎么运作我们首先将每个保存value在一个列表中,我们将把它传递给函数。每次运行我们检查我们的当前值是否在该列表中,True一旦有重复就返回。if (a in values): return True接下来get_dups,如果当前索引也是字典,我们只需遍历值并运行它们。

繁花如伊

将嵌套字典转换为其值的嵌套列表:def nested_values(v):    return map(nested_values, v.values()) if isinstance(v, dict) else v然后将嵌套列表展平为字典中所有值的一个列表,然后检查展平的值列表是否有重复项:from itertools import chaindef is_duplicated_value(d):    flat = list(chain.from_iterable(nested_values(d)))    return len(flat) != len(set(flat))测试:print is_duplicated_value( {1:'a', 2:'b', 3:{1:'c', 2:'a'}} )print is_duplicated_value( {1:'a', 2:'b', 3:{1:'c', 2:'d'}} )输出:TrueFalse根据您的使用和字典的大小等,您可能希望将这些步骤重新转换为递归函数,该函数将每个值添加到set检查每个值是否在集合中,然后True立即添加和返回,或者False字典是否已用完。class Duplicated(ValueError): passdef is_dup(d):    values = set()    def add(v):        if isinstance(v, dict):            map(add, v.values())        else:            if v in values:                raise Duplicated            else:                values.add(v)    try:        add(d)        return False    except Duplicated:        return True测试:print is_dup( {1:'a', 2:'b', 3:{1:'c', 2:'a'}} )print is_dup( {1:'a', 2:'b', 3:{1:'c', 2:'d'}} )输出:TrueFalse
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python