为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

30秒到达战场 2021-11-09 16:27:55
我有一个嵌套字典,我正在尝试在 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'我怎样才能让它工作?谢谢您的帮助!注意:如果可能,我更喜欢不使用库的解决方案
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超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)

结果为真


查看完整回答
反对 回复 2021-11-09
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

我写了一个简单的解决方案:


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 False


print(get_dups(dictionary))

这个怎么运作

我们首先将每个保存value在一个列表中,我们将把它传递给函数。每次运行我们检查我们的当前值是否在该列表中,True一旦有重复就返回。


if (a in values): return True

接下来get_dups,如果当前索引也是字典,我们只需遍历值并运行它们。


查看完整回答
反对 回复 2021-11-09
?
繁花如伊

TA贡献2012条经验 获得超12个赞

将嵌套字典转换为其值的嵌套列表:


def nested_values(v):

    return map(nested_values, v.values()) if isinstance(v, dict) else v

然后将嵌套列表展平为字典中所有值的一个列表,然后检查展平的值列表是否有重复项:


from itertools import chain


def 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'}} )

输出:


True

False

根据您的使用和字典的大小等,您可能希望将这些步骤重新转换为递归函数,该函数将每个值添加到set检查每个值是否在集合中,然后True立即添加和返回,或者False字典是否已用完。


class Duplicated(ValueError): pass


def 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'}} )

输出:


True

False


查看完整回答
反对 回复 2021-11-09
  • 3 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信