有没有什么Python模块可以用于[{},{}...]比较?
Is there any Python module can be adopted for [{},{}...] comparation?
目的是比较Python中的两个由dict元素组成的列表,在每个dict元素中,有两个key。下面提供了示例。
A=[{'id':'u2s8Et','value':'David'},{'id':'u2s0PW','value':'Linda'},......]
B=[{'id':'u2s8Et','value':'David'},{'id':'u2s7PA','value':'Steven'},......]
希望得到哪些元素只存在于列表A中,哪些元素在列表A中与列表B中不同,有没有现成的模块可以采用比较?
unittest模块中的assertListEqual方法比较接近预期,但还是希望有更全面的模块。
您可以使用 set.intersection()
和 set.difference
等集合运算。此外,您应该考虑创建自定义 class 而不是使用字典。
主要问题是 dict
不可哈希。但是,因为它们每个都有相同的键,所以我们可以将它们转换为可哈希类型,例如 tuple
.
def parse(values):
return set(map(tuple, map(dict.values, values)))
>>> parse(A)
>>> {('u2s0PW', 'Linda'), ('u2s8Et', 'David')}
我们现在可以使用 set
操作来比较每个元素。
In [6]: parse(A).difference(parse(B))
Out[6]: {('u2s0PW', 'Linda')}
In [7]: parse(A).intersection(parse(B))
Out[7]: {('u2s8Et', 'David')}
set.difference
会找到 A
但不在 B
中的项目,set.intersection
会找到 A
和 A
中的项目B
.
编辑:由于您的 dict
都遵循相同的格式,您也可以考虑使用 namedtuple
。
In [1]: from collections import namedtuple
In [2]: entry = namedtuple("Entry", ("id", "value"))
In [3]: A = [{'id':'u2s8Et', 'value':'David'}, {'id':'u2s0PW', 'value':'Linda'}]
...: B = [{'id':'u2s8Et', 'value':'David'}, {'id':'u2s7PA', 'value':'Steven'}]
...:
In [4]: def parse_to_entry(values):
...: return {entry(d["id"], d["value"]) for d in values}
...:
In [5]: parse_to_entry(A)
Out[5]: {Entry(id='u2s0PW', value='Linda'), Entry(id='u2s8Et', value='David')}
In [6]: parse_to_entry(A).difference(parse_to_entry(B))
Out[6]: {Entry(id='u2s0PW', value='Linda')}
In [7]: parse_to_entry(A).intersection(parse_to_entry(B))
Out[7]: {Entry(id='u2s8Et', value='David')}
目的是比较Python中的两个由dict元素组成的列表,在每个dict元素中,有两个key。下面提供了示例。
A=[{'id':'u2s8Et','value':'David'},{'id':'u2s0PW','value':'Linda'},......]
B=[{'id':'u2s8Et','value':'David'},{'id':'u2s7PA','value':'Steven'},......]
希望得到哪些元素只存在于列表A中,哪些元素在列表A中与列表B中不同,有没有现成的模块可以采用比较?
unittest模块中的assertListEqual方法比较接近预期,但还是希望有更全面的模块。
您可以使用 set.intersection()
和 set.difference
等集合运算。此外,您应该考虑创建自定义 class 而不是使用字典。
主要问题是 dict
不可哈希。但是,因为它们每个都有相同的键,所以我们可以将它们转换为可哈希类型,例如 tuple
.
def parse(values):
return set(map(tuple, map(dict.values, values)))
>>> parse(A)
>>> {('u2s0PW', 'Linda'), ('u2s8Et', 'David')}
我们现在可以使用 set
操作来比较每个元素。
In [6]: parse(A).difference(parse(B))
Out[6]: {('u2s0PW', 'Linda')}
In [7]: parse(A).intersection(parse(B))
Out[7]: {('u2s8Et', 'David')}
set.difference
会找到 A
但不在 B
中的项目,set.intersection
会找到 A
和 A
中的项目B
.
编辑:由于您的 dict
都遵循相同的格式,您也可以考虑使用 namedtuple
。
In [1]: from collections import namedtuple
In [2]: entry = namedtuple("Entry", ("id", "value"))
In [3]: A = [{'id':'u2s8Et', 'value':'David'}, {'id':'u2s0PW', 'value':'Linda'}]
...: B = [{'id':'u2s8Et', 'value':'David'}, {'id':'u2s7PA', 'value':'Steven'}]
...:
In [4]: def parse_to_entry(values):
...: return {entry(d["id"], d["value"]) for d in values}
...:
In [5]: parse_to_entry(A)
Out[5]: {Entry(id='u2s0PW', value='Linda'), Entry(id='u2s8Et', value='David')}
In [6]: parse_to_entry(A).difference(parse_to_entry(B))
Out[6]: {Entry(id='u2s0PW', value='Linda')}
In [7]: parse_to_entry(A).intersection(parse_to_entry(B))
Out[7]: {Entry(id='u2s8Et', value='David')}