2013-01-23 60 views
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}, 
       {'a':'cc','b':11,'c':22,'d':33}] 

表2比较与公差字典蟒列表列顺序

|'a' | 'b' | 'c' |'d' | 
    |'aaa'|'bbb'|'ccc'|'ddd'| 
    |'bb' |1 |2 |3 | 
    |'cc' |11 |22 |33 | 

表1

|'a' | 'b' | 'c' |'d' | 
    |'aaa'|'ccc'|'bbb'|'ddd'| 
    |'bb' |2 |1 |3 | 
    |'cc' |22 |11 |33 | 

在上面的表中,第一行的顺序是一样的。第二行属性是主键。即使它们的顺序发生了变化,但下面的值都很好,它们是相等的

我有两个表,它们转换为我的代码中的字典列表。表的第一行是字典的关键字。我必须比较这两个,即使列顺序从第二行开始改变,这两个实体也是相同的。所以在上面的例子中,它们是相同的。

换句话说,字典的键不是表的主键。第二行属性是。如何编写代码来执行此类比较。

+0

发表一个他们不同的例子。 –

+0

我不清楚你想要做什么....检查两个列表是否包含相同的字典或他们不是? – Netwave

+1

我建议你也以表格格式发布你的字典,并显示你想要比较的内容。现在很难掌握你的意图。 – root

回答

2

函数compare()根据我了解的是您的等同性条件比较第一次和第二次匹配,如果相等,则返回True。

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) 
+0

谢谢塞巴斯蒂安和加托! –

+0

这只是比较价值观,但他们没有按照你要求的关键字排序......这是你的意思吗? – Useless

+0

不完全,但它需要我写答案! –

1

如果唯一值的顺序并不重要,按键可以忽略不计:

key = lambda d: set(d.values()) 
eq = all(a == b for a, b in zip(map(key, first), map(key, second))) 

看来你真的想找出两个表中是否有忽视列的顺序相同的列:

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))