2017-11-16 2 views
1
for x in range(0,img_row): 
    for y in range(0,img_col): 
     img_lst.append([img[x,y][0],img[x,y][1],img[x,y][2]]) 
return img_lst 

Wie benutze ich Liste Verständnis hier?Doppelte Iteration zu einer Liste Python 3

img_lst = [img[x,y][0], img[x,y][1], img[x,y][2] y for y in range(0,img_col) for x in range(0, img_row)] 

Ich versuchte dies aber es ist meine ungültige Syntax geben und wenn ich „y“ am Anfang zu entfernen gibt es mir, dass Y nicht

die ganze Funktion definiert:

def cvimg_to_list(img): 
    img_row = img.shape[0] 
    img_col = img.shape[1] 
    img_lst=[] 

    img_lst = [img[x,y][0], img[x,y][1], img[x,y][2] y for y in range(0,img_col) for x in range(0, img_row)] 
    return img_lst 
+1

'... img [x, y] [ 2] y ... 'das scheint falsch –

Antwort

4

Um verschachtelte Schleifen mit einem list.append() Aufruf zu einem Listenverständnis zu konvertieren, alles, was Sie tun müssen, ist alles zwischen den .append(...) Klammern nach vorne zu bewegen, entfernen Sie die : Doppelpunkte nach den for Schleifen, und fin Verbündeter hinzufügen [...] um das Ergebnis:

[ 
[img[x,y][0],img[x,y][1],img[x,y][2]] 
for x in range(0,img_row) 
    for y in range(0,img_col) 
] 

Beachten Sie, dass die Reihenfolge der for Schleifen nicht ändern!

Dies kann dann auf eine Zeile gesetzt werden; Ich habe einige Leerzeichen, um die Lesbarkeit und vereinfacht die range() Anrufe:

[img[x, y][:3] for x in range(img_row) for y in range(img_col)] 

Sie haben drei Fehler:

[[img[x, y][0], img[x, y][1], img[x, y][2]] 
for x in range(img_row) for y in range(img_col)] 

Weil Sie eine neue Liste mit den ersten drei Werte von img[x, y] bauen, können Sie auch schneiden können in deinem Versuch; Sie haben die Reihenfolge der for Loops ausgetauscht, Sie haben eine zusätzliche, streunende y hinzugefügt, und Sie haben die ] schließende Klammer für das Listenobjekt, das Sie bei jeder Iteration erstellen, gelöscht.

1

Ich bin mir nicht ganz sicher, was Sie erreichen wollen, aber wenn meine Annahme richtig ist (Sie wollen eine Liste von Pixelwerten aus den drei Kanälen eines Bildes erhalten, das Sie mit opencv geöffnet haben) kann dazu numpy verwenden.

Bedenkt, dass cv2 Bilder als BGR und nicht RGB lädt.

Anmerkung: nicht richtig ist, eine Antwort auf die Frage, würde ich lieber Diesen Beitrag als Kommentar, aber ich habe nicht genug Ruf für den

+0

Bitte beachten Sie das Limit für Kommentare wurde dort für [allgemeine Zwecke] gesetzt (https://meta.stackexchange.com/questions/214173/why-do-i-need-50- Reputation-zu-Kommentar-What-Can-I-Do-stattdessen) und selbst wenn Sie es gut meinen, eine Antwort zu verwenden, die nicht gut ankommt. In diesem Fall, wenn das OP nur nach einer Möglichkeit sucht, das Bild auf eine Liste zu reduzieren, hat Ihr Beitrag einen Verdienst ** als Antwort **, aber wenn sie daran interessiert sind, die Verständnislisten explizit zu schreiben, naja ... – Reti43