簡體   English   中英

比較2個不同的列表

[英]Comparing 2 different list of lists

例如,有以下2個列表列表

A = [[0, 1, 2, 1, 9], [1, 0, 0, 6, 0], [2, 0, 0, 15, 2], [1, 6, 15, 0, 7], [9, 0, 2, 7, 0]]

B = [[0, 19, 1, 0, 12], [19, 0, 2, 0, 0], [1, 2, 0, 0, 2], [0, 0, 0, 0, 3], [12, 0, 2, 3, 0]]

所以我想做的是,我想比較2個不同的列表中的每個值。 我想將A [0] [0]與B [0] [0]進行比較,而不是將A [0] [1]與B [0] [0]進行比較。 所以基本上我想像A中的第一個列表中的第一個值與B中的相應值進行比較,依此類推。 我怎樣才能做到這一點? 非常感謝:)編輯:對不起。 我的名單長短不一。 這是更新的版本。

如果您需要知道它們是否相同,請運行以下命令:

list1 = [['first',1], ['second',2], ['third',3]]
list2 = [['first',1], ['second',2], ['third',3]]
print(sorted(list1) == sorted(list2))

結果: true

您可以使用雙重列表理解來始終選擇最大值並創建一個新的平面列表:

>>> A = [[0, 1, 2, 1, 9], [1, 0, 0, 6, 0], [2, 0, 0, 15, 2], [1, 6, 15, 0, 7], [9, 0, 2, 7, 0]]
>>> B = [[0, 19, 1, 0, 12], [19, 0, 2, 0, 0], [1, 2, 0, 0, 2], [0, 0, 0, 0, 3], [12, 0, 2, 3, 0]]
>>> [max(a,b) for la,lb in zip(A,B) for a,b in zip(la,lb)]
[0, 19, 2, 1, 12, 19, 0, 2, 6, 0, 2, 2, 0, 15, 2, 1, 6, 15, 0, 7, 12, 0, 2, 7, 0]

如果要保留二維結構,則可以使用嵌套列表理解:

>>> [[max(a,b) for a,b in zip(la,lb)] for la,lb in zip(A,B)]
[[0, 19, 2, 1, 12], [19, 0, 2, 6, 0], [2, 2, 0, 15, 2], [1, 6, 15, 0, 7], [12, 0, 2, 7, 0]]

要檢查兩個列表是否相等,您只需執行以下相等檢查:

A == B

但是,如果您想知道子列表的哪些元素不同,或者想知道列表不同的位置或索引“坐標”,那么您可能想要這樣做:

A = [[0, 1, 2, 1, 9], [1, 0, 0, 6, 0], [2, 0, 0, 15, 2], [1, 6, 15, 0, 7], [9, 0, 2, 7, 0]]
B = [[0, 19, 1, 0, 12], [19, 0, 2, 0, 0], [1, 2, 0, 0, 2], [0, 0, 0, 0, 3], [12, 0, 2, 3, 0]]

differences = [
    (outer_idx, inner_idx)
    for outer_idx, (a, b) in enumerate(zip(A, B))
    for inner_idx, (a_element, b_element) in enumerate(zip(a, b))
    if a_element != b_element
]

print(differences)

# output
[(0, 1),
 (0, 2),
 (0, 3),
 (0, 4),
 (1, 0),
 (1, 2),
 (1, 3),
 (2, 0),
 (2, 1),
 (2, 3),
 (3, 0),
 (3, 1),
 (3, 2),
 (3, 4),
 (4, 0),
 (4, 3)]

所有這些意味着對於(0,1),列表是不同的。 即: A[0][1] != B[0][1] ,依此類推。

#returns True if f is larger than s
def compare(f, s):
    print("comparing {} and {}".format(f,s))
    return f > s

def compare_lists(A,B):
    for sub_lists in zip(A,B):
        for first, second in zip(sub_lists[0], sub_lists[1]):
            compare(first, second)

您尚未指定所需的比較類型。 其他答案假定您要檢查是否相等。 這是一種更通用的方法。 將您想要的任何比較邏輯放入compare(f,s)

編輯:您的子列表包含不同數量的元素。 此方法僅根據最短的子列表進行比較。 因此,對於[1,2][1] ,僅比較11 ,因為從第一個列表中沒有2匹配條目。

Edit2:您剛剛編輯了帖子。 我認為這是故意的,因為長度有所不同。

假設您想知道它們是否相同:

def compare(a,b):
    if (len(a) != len(b) ) return false;
    for i in range(0, len(a)):
       if ( len(a[i]) != len(b[i]) ) return false;
       for j in range(0, len(a[i])):
           if (a[i][j]!=b[i][j]) return false;
    return true;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM