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   |

上記の表では、最初の行の順序は同じです。2行目の属性は主キーです。順序が変わっても、下の値は問題ありませんが、同じです

2つのテーブルがあり、それらはコード内の辞書のリストに変換されます。テーブルの最初の行は辞書のキーです。列の順序が2行目以降に変わっても、2つのエンティティが同じになるように、これら2つを比較する必要があります。したがって、上記の例では、それらは同じです。

つまり、ディクショナリのキーはテーブルの主キーではありません。2行目の属性はです。そのような比較を実行するためのコードを書く方法。

4

2 に答える 2

2

関数 compare() は、私が理解した等価基準に従って最初と 2 番目が一致するかどうかを比較し、等しい場合は 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)))

列の順序を無視して、2 つのテーブルに同じ列があるかどうかを実際に確認したいようです。

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 に答える