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}]

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

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

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

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

4

2 回答 2

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)
于 2013-01-23T11:16:06.380 回答
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))
于 2013-01-23T11:15:54.340 回答