2012-03-28 19 views
2

Ich möchte unterschiedliche Listen dieser Art vergleichen:Python finden Elemente in der Liste

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] 

und herauszufinden, welche Elemente unterscheiden. In diesem Fall sollte der Index 5 von A und der Index 7 von B zurückgegeben werden. Alle anderen Elemente sind gleich. Gibt es dafür eine Funktion?

besten, US

+0

Warum nicht Index 5 von B oder Index 7 von A? Nehmen Sie ein Muster an? –

+0

Kein Muster.Zählen einfach. – user366121

Antwort

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

Was auf der Erde ist, dies zu tun?

  1. Zip die Liste mit fortlaufenden Nummern. Erzeuge also eine Liste von Tupeln, bei denen der erste Wert das Element in der Liste und der zweite sein Index ist.
  2. Erstellen Sie Sätze von jeder, so dass sie mit festgelegten Funktionen verglichen werden können. Tupeln unveränderlich sind daher hashable daher kann
  3. die eingestellte Differenz zwischen den beiden
  4. Suchen Sie sich den Index der verschiedenen Elemente

EDIT

Dank Nehmen Sie in einem Satz gespeichert werden, um Romans Kommentar, das ist einfacher, macht aber das Gleiche.

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

Beachten Sie, dass während zip eine Liste erzeugt, enumerate eine zählbare erzeugt, die sofort aufgezählt wird, um die Liste zu erstellen. Es erzeugt auch Tupes vom Typ (index, value) statt (value, index) wie in der obigen Antwort.

+2

'zip (A, xrange (len (A)))' ist 'enumerate (A)' –

+0

Ok, aber ich vermisse Xrange-Funktion. In welchem ​​Modul ist es? – user366121

+0

xrange ist in der standard lib – vascop

1

Wollen Sie unbedingt einen Einzeiler? Denn sonst einfacher Code gibt es:

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

Das ist auch in Ordnung. Thx – user366121

1

So etwas sollte den Trick (ungetestet) tun:

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

Diese Liste der Anzahl von Elementen zurück, die unterschiedlichen Werte in jeder Liste.

Wenn Ihr Datensatz anders als in der Frage ist, dann könnte man diese verwenden:

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

Solange es nur 1s und 0s ist! – jamylak

+0

@jamylak: Das bedeutet "_exactly wie in der Frage! _" :) – Tadeck

+0

es sei denn, jemand versucht, unterschiedliche Elemente in zwei verschiedenen Arten von Listen zu finden, vergiss hahaha – jamylak

1

Eine andere (vielleicht besser lesbar?) Einzeiler:

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

dieser ersten Reißverschlüsse, die zusammen aufgeführt:

[(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)] 

Und legt dann auf die Elemente einen Index mit der enumerate() Funktion:

[(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))] 

Es verwendet dann einen ziemlich Standard list comprehension, um die Elemente zu vergleichen, eine Liste von Indizes baut, wo die Elemente nicht übereinstimmen.

+0

Ihre Antwort ist sehr ähnlich zu mir. Sind Sie einverstanden? – Tadeck

+0

stimme ich zu. Dein wurde geposted, während ich meins schrieb ... möchtest du, dass ich meine Antwort lösche? –

+0

Dann hast du deine Antwort für 20 Minuten geschrieben, bis du es gepostet hast;) Nein, wenn du möchtest, dass es bleibt, dann lösche es nicht. Aber bitte fügen Sie einen Wert hinzu, so dass es nicht von anderen als "Copy & Paste" -Antwort behandelt wird. – Tadeck

Verwandte Themen