【问题标题】:python dictionary(dictionary(dictionary(list))) comparison [closed]python字典(字典(字典(列表)))比较[关闭]
【发布时间】:2014-07-16 12:46:29
【问题描述】:

所以我想要一种比较 d1 和 d2 的方法

d1=
{"tables":
  {"k1":
    {"columns":
      ["val1","val2","val3"]
    },
    "forward":
    {"k2":
      ["val1","val2","val3"]
    }
  }
}

d2= 
{"tables":
  {"k1":
    {"columns":
      ["val2","val1","val3"]
    },
    "forward":
    {"k2":
      ["val2","val1","val3"]
    }
  }
}

并且相等。这两个列表字典来自不同的来源,我想要最简洁的解决方案。我确信这很简单,但我现在很困惑。

编辑1: 显然你明白我的问题。这正是我的意思。列表不相等,我事先不知道它们是列表,也不知道在存在与列表对应的键集之前有多少字典。这些来自 json 字符串,因此字典不会区分列表和集合(我猜......)

【问题讨论】:

  • 你考虑过d1 == d2吗?
  • 这两种数据结构的相等性是什么?
  • 这些不相等。这些列表的顺序不同。
  • 这正是我的意思。 [1, 2, 3] != [3, 2, 1]]
  • 你可以依赖多少结构是相同的?它会一直是列表字典的字典吗?你关心任何列表的顺序吗? 你对平等的定义是什么?

标签: python list dictionary comparison


【解决方案1】:

如果您不关心字典结构中任何 list 的顺序,您可以将它们全部递归转换为无序的set 数据结构:

def lists_to_sets(d):
    for k, v in d.items():
        if isinstance(v, list):
            d[k] = set(v)
        elif isinstance(v, dict):
            lists_to_sets(v)

这假定列表包含可散列对象 - 如果它们包含例如dicts 这不起作用。实际操作:

>>> d1 = {"tables": {"k1": {"columns": ["val1", "val2", "val3"]},
                     "forward": {"k2": ["val1", "val2", "val3"]}}}
>>> d2 = {"tables": {"k1": {"columns": ["val2", "val1", "val3"]},
                     "forward": {"k2": ["val2", "val1", "val3"]}}}
>>> d1 == d2
False
>>> lists_to_sets(d1)
>>> lists_to_sets(d2)
>>> d1 == d2
True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2014-02-20
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多