簡體   English   中英

python在列表中找到不同的元素

[英]python find differing elements in list

我想比較這種清單:

A = [0,1,0,1,0,1,0,0,0,1,0,1,0,1,0]
B = [0,1,0,1,0,0,0,1,0,1,0,1,0,1,0]

並找出哪些元素有所不同。 在這種情況下,它應該返回A的索引5和B的索引7。所有其他元素相同。 有這個功能嗎?

最好,美國

>>> [index for (_, index) in set(zip(A, xrange(len(A)))) - set(zip(B, xrange(len(B))))]
[5, 7]

這到底在做什么?

  1. 用遞增數字壓縮列表。 因此,生成一個元組列表,其中第一個值是列表中的元素,第二個是其索引。
  2. 創建每個的集合,以便可以將它們與集合函數進行比較。 元組是不可變的,因此是可哈希的,因此可以存儲在集合中
  3. 取兩者之間的設定差
  4. 選擇不同項目的索引

編輯

感謝Roman的評論,這比較簡單,但是卻做同樣的事情。

>>> [index for (index, _) in set(enumerate(A)) - set(enumerate(B))]
[5, 7]

請注意,雖然zip生成一個列表,但enumerate生成一個可枚舉的對象,該對象立即被枚舉以構建列表。 同樣,它會生成類型為(index, value)而不是(value, index)如上面的答案。

您一定要單線嗎? 因為否則會有更簡單的代碼:

for i in range(len(A)):
    if A[i]!=B[i]:
        print i

這樣的事情應該可以解決這個問題(未經測試):

[i for i, v in enumerate(zip(A, B)) if sum(v) == 1]

這將返回在每個列表中具有不同值的元素數量的列表。

如果您的數據集與問題中的數據集不同,則可以使用以下方法:

[i for i, v in enumerate(zip(A, B)) if v[0] != v[1]]

另一種(也許更具可讀性?)

>>> [index for (index,(a,b)) in enumerate(zip(A,B)) if a!=b]
[5, 7]

首先,將列表壓縮在一起:

[(0, 0), (1, 1), (0, 0), (1, 1), (0, 0), (1, 0), (0, 0), (0, 1), (0, 0), 
(1, 1), (0, 0), (1, 1), (0, 0), (1, 1), (0, 0)]

然后使用enumerate()函數將索引附加到項目:

[(0, (0, 0)), (1, (1, 1)), (2, (0, 0)), (3, (1, 1)), (4, (0, 0)), (5, (1, 0)), 
(6, (0, 0)), (7, (0, 1)), (8, (0, 0)), (9, (1, 1)), (10, (0, 0)), (11, (1, 1)), 
(12, (0, 0)), (13, (1, 1)), (14, (0, 0))]

然后,它使用相當標准的列表理解來比較項目,並在項目不匹配的地方建立索引列表。

暫無
暫無

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

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