是否有任何Python模块可以用于[{},{}…]比较?

2024-04-26 01:12:16 发布

您现在位置:Python中文网/ 问答频道 /正文

它旨在比较Python中由dict元素组成的两个列表,每个dict元素中有两个键。下面提供了示例。你知道吗

A=[{'id':'u2s8Et','value':'David'},{'id':'u2s0PW','value':'Linda'},......]
B=[{'id':'u2s8Et','value':'David'},{'id':'u2s7PA','value':'Steven'},......]

希望得到哪些元素只在列表A中可用,哪些元素在列表A中不同于列表B中的元素。是否有任何现有的模块可以用来比较?你知道吗

unittest模块中的方法assertListEqual接近预期,但更全面的模块是首选。你知道吗


Tags: 模块方法id元素示例列表valueunittest
2条回答

可以使用集操作,例如set.intersection()set.difference。您还应该考虑创建一个自定义类,而不是使用字典。你知道吗

主要问题是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将查找同时在AB中的项。你知道吗


编辑:因为您的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')}

相关问题 更多 >