2012-10-26 12 views
6

Ich habe eine koordinierte Speicherliste in Python A[row,col,value] zum Speichern von Nicht-Nullen-Werte.Erste Elemente in der inneren Liste effizient wie möglich

Wie kann ich die Liste aller Zeilenindizes bekommen? Ich habe erwartet, dass A[0:][0] funktioniert als print A[0:] druckt die ganze Liste, aber print A[0:][0] nur Drucke A[0].

Der Grund I stellen, ist für eine effiziente Berechnung der Anzahl von Nicht-Null-Werte in jeder Reihe d.h über range(0,n) Iterieren wobei n die Gesamtzahl der Zeilen ist. Dies sollte viel billiger sein als meine aktuelle Art von for i in range(0,n): for j in A: ....

Etwas wie:

c = [] 
# for the total number of rows 
for i in range(0,n): 
    # get number of rows with only one entry in coordinate storage list 
    if A[0:][0].count(i) == 1: c.append(i)     
return c 

Over:

c = [] 
# for the total number of rows 
for i in range(0,n): 
    # get the index and initialize the count to 0 
    c.append([i,0]) 
    # for every entry in coordinate storage list 
    for j in A: 
     # if row index (A[:][0]) is equal to current row i, increment count 
     if j[0] == i: 
      c[i][1]+=1 
return c 

EDIT:

Mit Junuxx Antwort, this question und this post ich mit den folgenden kam (zur Rückführung der Zahl von Singleton - Reihen), die für viel schneller ist meine aktuelle Problemgröße von A als mein ursprünglicher Versuch. Es wächst jedoch immer noch mit der Anzahl der Zeilen und Spalten. Ich frage mich, ob es möglich ist, nicht über A zu iterieren, sondern nur bis n?

# get total list of row indexes from coordinate storage list 
row_indexes = [i[0] for i in A] 
# create dictionary {index:count} 
c = Counter(row_indexes)  
# return only value where count == 1 
return [c[0] for c in c.items() if c[1] == 1] 
+1

@larsman: Ich gehe davon aus A eine Liste von Tripel ist. – Junuxx

+0

Ja, du hast es verstanden. –

+1

Können Sie ein einfaches, ineffizientes Arbeitsbeispiel für das schreiben, was Sie zu tun versuchen? Ich finde den Wortlaut der Frage wirklich verwirrend, und keiner Ihrer Beispielcodeblöcke scheint dasselbe zu tun ..? – dbr

Antwort

10

Dies sollte es tun:

c = [x[0] for x in A] 

Es ist eine Liste Verständnis, dass die erste (Teil-) Element jedes Element von A nimmt.

+0

Dies funktioniert viel besser als meine ursprüngliche Lösung. Bitte sehen Sie meine Bearbeitung, ist es möglich, nicht über A zu iterieren? Sehr geschätzt! –

+0

Wenn A sehr groß ist, aber die Elemente von A nur drei Mitglieder haben, kann es effizienter sein, drei Listen zu speichern: 'rows',' columns' und 'values'. Sie können alle Zeilennummern sofort abrufen und können dennoch auf einen einzelnen Eintrag zugreifen, indem Sie für alle drei Listen denselben Index verwenden (sie sind ausgerichtet). Wenn sowohl A als auch die Unterlisten lang sind, kann es besser sein, eine echte zweidimensionale Datenstruktur zu verwenden, wie sie von numpy bereitgestellt wird (siehe die Antwort von Jon Clements) und nicht verschachtelte Listen. – Junuxx

4

Für efficieny und erweiterten Slices können Sie numpy verwenden - was Ihr Beispiel gegeben scheint wie eine gute Idee:

import numpy as np 
yourlist = [ 
    [0, 0, 0], 
    [0, 1, 1], 
    [1, 0, 2] 
] 
a = np.array(yourlist) 
print a[:,0] 
# [0 0 1] 
bc = np.bincount(a[:,0]) 
# array([2, 1]) 
count = bc[bc==1].size 
# 1 
# or... (I think it's probably better...) 
count = np.count_nonzero(bc == 1) 
+0

Ich kann Ihr Beispiel nicht zur Arbeit bringen. 'Type (mylist [0] [0])' gibt 'int' zurück,' type (a [0] [0]) 'gibt' numpy.float64' nach 'a zurück = numpy.array (mylist) 'wenn ich versuche' bincount (a [:, 0]) 'Ich bekomme' TypeError: array kann nicht sicher in den erforderlichen Typ umgewandelt werden 'Ich habe versucht 'bc = numpy.bincount (numpy.arange (a [:, 0], dtype = numpy.int)) 'und der Fehler ist' TypeError: nur length-1-Arrays können in Python-Skalare konvertiert werden. –

+0

@sudo_o Nicht sicher, was ich dazu sagen soll - nach 'np.array' (nicht' np.arange') beende ich up mit 'type (a [0] [0])' und alles andere funktioniert einfach ... –

Verwandte Themen