Selenium 如何断言两个元素顺序不一致的列表相同?

醋精测试媛 · 2021年01月08日 · 最后由 Thirty-Thirty 回复于 2021年01月10日 · 157 次阅读

unittest 需要断言两个列表是一样的,但是列表中的元素是字典,而且两个列表的顺序不一样。
如何比较?

我知道 assertListEqual 是有序比较,assertSetEqual 是无序比较,但是好像无法把列表转为 set,因为列表中元素是字典类型的。
例子如下:

[{"a": "apple", "b": "banana"}, {"a": "angry", "b": "boring"}]
[{"a": "angry", "b": "boring"}, {"a": "apple", "b": "banana"}]
共收到 11 条回复 时间 点赞

两个列表都 sort 再对比

可以自己写个断言方法

把 keys 和 values 都拿出来做比较,Python 字典有对应的方法

如果你是不关注顺序,只关注元素相同,那两个列表都用一样的规则排个序,再比较就好了。

知行 回复

不是字典,是字典列表

@xglh0901 @chenhengjie123 谢谢,了解了! 一直纠结于 unittest 提供的固有 assert 方法,没有想到可以先对列表做处理

类似以下方法,len(list1)==0 就相同了。如果调试没过,就忽略我说的,好久没用过 python 了

list=[{"a": "apple", "b": "banana"}, {"a": "angry", "b": "boring"}]
list1=[{"a": "angry", "b": "boring"}, {"a": "apple", "b": "banana"}]
for i in list:
    list1.remove(dict(i))

对啊,你把列表里面的字典拿出来再做处理就可以了

看下这个,随便写了下

def way(a):
    n = len(a)
    list3 = []
    list4 = []
    for i in range(0, n):
        list3.extend(list(a[i].keys()))
        list4.extend(list(a[i].values()))
    list3.extend(list4)
    return list3


list1 = [{"a": "apple", "b": "banana"}, {"a": "angry", "b": "boring"}]
list2 = [{"a": "angry", "b": "boring"}, {"a": "apple", "b": "banana"}]
k1 = way(list1)
k2 = way(list2)
if k1 == k2:
    print("pass")
else:
    print("fail")

这样可以么,转成字符串排序后比较

import json
print(sorted(json.dumps(a)) == sorted(json.dumps(b)))

看到标题就猜到是你提问了。 完整的用例是怎样的?

醋精测试媛 关闭了讨论 01月11日 01:14
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册