比较python字典列表与列顺序公差
表2比较python字典列表与列顺序公差,python,list,hash,dictionary,Python,List,Hash,Dictionary,表2 first = [{'a':'aaa','b':'ccc','c':'bbb','d':'ddd'}, {'a':'bb','b':2,'c':1,'d':3}, {'a':'cc','b':22,'c':11,'d':33}] second = [{'a':'aaa','b':'bbb','c':'ccc','d':'ddd'}, {'a':'bb','b':1,'c':2,'d':3},
first = [{'a':'aaa','b':'ccc','c':'bbb','d':'ddd'},
{'a':'bb','b':2,'c':1,'d':3},
{'a':'cc','b':22,'c':11,'d':33}]
second = [{'a':'aaa','b':'bbb','c':'ccc','d':'ddd'},
{'a':'bb','b':1,'c':2,'d':3},
{'a':'cc','b':11,'c':22,'d':33}]
表1
|'a' | 'b' | 'c' |'d' |
|'aaa'|'bbb'|'ccc'|'ddd'|
|'bb' |1 |2 |3 |
|'cc' |11 |22 |33 |
在上表中,第一行的顺序相同。第二行属性是主键。即使它们的顺序发生变化,但下面的值很好,它们也是相等的
我有两个表,它们在代码中转换为字典列表。表的第一行是字典的键。我必须对这两个进行比较,这样即使列顺序从第二行开始发生变化,这两个实体也是相同的。所以在上面的例子中,它们是相同的
换句话说,dictionary的键不是表的主键。第二行属性是。如何编写代码来执行此类比较。如果唯一值的顺序无关紧要,并且可以忽略键:
|'a' | 'b' | 'c' |'d' |
|'aaa'|'ccc'|'bbb'|'ddd'|
|'bb' |2 |1 |3 |
|'cc' |22 |11 |33 |
似乎您实际上想知道两个表是否具有相同的列,忽略列顺序:
key = lambda d: set(d.values())
eq = all(a == b for a, b in zip(map(key, first), map(key, second)))
函数compare()根据我理解的相等条件比较第一个匹配和第二个匹配,如果相等,则返回True
def columns(table):
values = lambda d: map(d.get, table[0]) # use same order for rows
return zip(*[values(row) for row in table]) # transpose
def equal_columns(first, second):
return sorted(columns(first)) == sorted(columns(second))
在不同的地方张贴一个例子。我不清楚你想做什么…检查两个列表是否包含相同的DICT?我建议你也以表格形式张贴两个DICT,并显示你想要比较的内容。现在很难理解你的意图。第一个=[{'a':无,'b':'ccc','c':'bbb','d':'ddd'},{'a':'bb','b':2,'c':4,'d':3},{'a':'cc','b':22,'c':44,'d':33}]如果第一个是这样的,第一个和第二个是不同的,不要把它放在评论中。代替你的问题谢谢塞巴斯蒂安和加托!这只是比较值,但它们不是按您要求的键排序的。。。这就是你的意思吗?不完全正确,但我需要写答案!
first = [{'a':'aaa','b':'ccc','c':'bbb','d':'ddd'},
{'a':'bb','b':2,'c':1,'d':3},
{'a':'cc','b':22,'c':11,'d':33}]
second = [{'a':'aaa','b':'bbb','c':'ccc','d':'ddd'},
{'a':'bb','b':1,'c':2,'d':3},
{'a':'cc','b':11,'c':22,'d':33}]
def compare(first,second):
for a,b in zip(first, second):
vals_a = list(a.values())
vals_b = list(b.values())
vals_a.sort()
vals_b.sort()
if vals_a != vals_b:
return False
return True
print compare(first,second)