2017-01-12 2 views
0

Ok, also habe ich zwei xlsx Blätter, beide Blätter haben in ihrer zweiten Spalte, bei Index 1, eine Liste von SIM-Karten-Nummern. Ich habe erfolgreich den Inhalt beider Spalten in meinem Powershell-Terminal als 2 Listen und die Menge der Elemente in diesen Listen gedruckt, nachdem diese Daten mit xlrd extrahiert wurden.XLRD: Erfolgreich 2 Listen aus 2 Blättern extrahiert, aber Listenvergleich funktioniert nicht

Das erste Blatt (ihrSheet) hat 454 Einträge, das zweite (unserSheet) hat 361. Ich muss die 93 finden, die nicht im zweiten Blatt existieren und sie in (unbezahlteSims) setzen. Ich könnte das natürlich manuell machen, aber ich möchte diese Aufgabe für die Zukunft automatisieren, wenn ich es unweigerlich wiederholen muss, also versuche ich dieses Python-Skript zu schreiben.

In Anbetracht Python stimmt überein, dass ich eine Liste von 454 Einträge und eine Liste von 361 Einträge habe, dachte ich, ich brauche nur einen Listenvergleich und ich recherchierte das auf Stack Overflow und versuchte 3 mal mit 3 verschiedenen Lösungen , aber jedes Mal, wenn ich dieses Skript verwende, um die dritte Liste (unbezahlteSim) zu erzeugen, heißt es 454 ... was bedeutet, dass es die Einträge, die in der kleineren Liste dupliziert sind, nicht entfernt hat. Bitte beraten.

from os.path import join, dirname, abspath 
import xlrd 

theirBookFileName = join(dirname(dirname(abspath(__file__))), 'pycel', 'theirBook.xlsx') 

ourBookFileName = join(dirname(dirname(abspath(__file__))), 'pycel', 'ourBook.xlsx') 

theirBook = xlrd.open_workbook(theirBookFileName) 

ourBook = xlrd.open_workbook(ourBookFileName) 

theirSheet = theirBook.sheet_by_index(0) 

ourSheet = ourBook.sheet_by_index(0) 

theirSimColumn = theirSheet.col(1) 

ourSimColumn = ourSheet.col(1) 

numColsTheirSheet = theirSheet.ncols 

numRowsTheirSheet = theirSheet.nrows 

numColsOurSheet = ourSheet.ncols 

numRowsOurSheet = ourSheet.nrows 

# First Attempt at the comparison, but fails and returns 454 entries from the bigger list 
unpaidSims = [d for d in theirSimColumn if d not in ourSimColumn] 
print unpaidSims 
lengthOfUnpaidSims = len(unpaidSims) 
print lengthOfUnpaidSims 
print "\nWe are expecting 93 entries in this new list" 

# Second Attempt at the comparison, but fails and returns 454 entries from the bigger list 
s = set(ourSimColumn) 
unpaidSims = [x for x in theirSimColumn if x not in s] 
print unpaidSims 
lengthOfUnpaidSims = len(unpaidSims) 
print lengthOfUnpaidSims 

# Third Attempt at the comparison, but fails and returns 454 entries from the bigger list 
unpaidSims = tuple(set(theirSimColumn) - set(ourSimColumn)) 
print unpaidSims 
lengthOfUnpaidSims = len(unpaidSims) 
print lengthOfUnpaidSims 
+0

Sind Sie sicher, dass alle Einträge in der kleineren Liste auch in der größeren Liste sind? – glibdud

Antwort

1

die xlrd Documentation Nach dem col Verfahren returns „eine Sequenz der Cell Objekte in der gegebenen Spalte“.

Es wird nichts über den Vergleich von Cell Objekte erwähnt. In the source eingrabend, scheint es, dass sie keine Vergleichsmethoden in die Klasse einprogrammierten. Als solches gibt die Python documentation an, dass die Objekte durch "Objektidentität" verglichen werden. Mit anderen Worten, der Vergleich ist False, es sei denn, sie sind die genau dieselbe Instanz der Cell Klasse, auch wenn die Werte, die sie enthalten, identisch sind.

Sie müssen stattdessen die value s der Cell s vergleichen. Zum Beispiel:

unpaidSims = set(sim.value for sim in theirSimColumn) - set(sim.value for sim in ourSimColumn)