2017-07-05 2 views
0

Im Moment habe ich dieseWie programmatisch erstellen und Shift-Liste

eine weitere Variable hinzufügen
up = [1, 0, 0, 0] 
down = [0, 1, 0, 0] 
left = [0, 0, 1, 0] 
right = [0, 0, 0, 1] 

Ich möchte ich

up = [1, 0, 0, 0, 0] 
down = [0, 1, 0, 0, 0] 
left = [0, 0, 1, 0, 0] 
right = [0, 0, 0, 1, 0] 
a = [0, 0, 0, 0, 1] 

tun müssen wissen, in meinem Code haben, und ich bin nicht sicher, Wie viele Variablen brauche ich oder ich brauche am Ende viel.

Ist es möglich, eine Liste der Variablen zu erstellen, die ich brauche, und dann eine Schleife durch jede einzelne zu machen und dies zu tun?

Ich bin nicht wirklich sicher, wie man das herausfinden soll.

+0

Ihre Frage ist nicht klar. Kannst du es anders formulieren? –

+0

Was hast du probiert? Etwas funktioniert nicht? [Wie zu fragen] (https://stackoverflow.com/help/how-to-ask) –

+0

ja, es ist möglich. Könnten Sie jedoch genau erklären, wofür das genau ist? Wenn Sie dies nur tun, um eindeutige Bezeichner zu erstellen, warum sollten Sie eine Liste verwenden? Was repräsentieren die '1's und' 0's eigentlich? Angenommen, es soll eine binäre Darstellung sein, warum nicht einfach "1", "2", "4", "8" usw. verwenden, anstatt (potenziell riesige) Listen zu erstellen? – Zinki

Antwort

1

Was Sie tun, heißt "One-Hot-Encoding", und Sie könnten das leicht tun. Zuerst, erstellen Sie ein Diktat Ihrer "Variablen", aber anstatt jedes als [0,0,0,1] zu schreiben schreiben Sie einfach ihre Indizes. Oder noch besser, verwenden Sie eine indizierte Liste ihre Namen zu speichern:

mylist = ['up','down','left','right'] 

Dann definieren Sie eine Funktion, die diese Liste/dict und die „Variable“ Zahl (die in diesem dict wirklich der Schlüssel nimmt, oder das Element in der Liste) und gibt das richtige „one-hot“ encoding:

def onehot(mylist, key): 
    index = mylist.index(key) 
    zeros = [0 for i in mylist] 
    zeros[index] = 1 
    return zeros 

Nun, wenn Ihre Liste ist, wie es oben geschrieben, onehot(mylist, 'up') ausgeben wird [1,0,0,0] läuft. Wenn Sie diese Liste jederzeit zu verlängern entscheiden, könnten Sie einfach mylist.append('newname') laufen und noch einmal, laufen unsere kleinen Helfer - onehot(mylist, 'newname') Wille Ausgang [0,0,0,0,1]

Eine alternative Implementierung die ganze Arbeit in einer einzigen Liste Verständnis zu tun ist. Das Finden des Indexes kann teuer sein (es ist O (n)), da die Liste Element für Element durchsucht werden muss. Reduziert man dies auf einen Durchlauf reduziert sich die Komplexität ein wenig:

def onehot(mylist, key): 
    return [int(i == key) for i in mylist] 
+1

Sie sind Gottes Geschenk an die Menschheit. – DanMossa

+1

Alternative Implementierung: 'return [int (i == Schlüssel) für i in mylist]' muss nur einen Durchlauf durch die Liste machen. (Ihr benötigt bis zu zwei vollständige Durchgänge wegen 'list.index()' – Baldrickk

+0

Korrekt, fühlen Sie sich frei, das am Ende als Alternative zu bearbeiten, ich werde die Änderung genehmigen –

-1

Das Hinzufügen eines Wertes zu einer Liste in Python erfolgt mit append() oder extend(). Beim Anhängen einer Liste von Elementen an eine Liste wird die neue Liste am Ende der vorhandenen Liste platziert, während beim Erweitern einer Liste jedes neue Element der Erweiterungsliste am Ende der vorhandenen Liste platziert wird.

Zum Beispiel, wenn Sie nicht sicher sind, wie viele Elemente, die Sie in Ihren Listen am Ende brauchen, werden Sie eine Funktion erstellen können, die sie mit einer beliebigen Anzahl von Elementen erweitert:

>>> up = [1, 0, 0, 0] 
>>> down = [0, 1, 0, 0] 
>>> left = [0, 0, 1, 0] 
>>> right = [0, 0, 0, 1] 
>>> def extend_list(list, items): 
...  return list.extend(items) 
... 
>>> extend_list(up, [0]) 
>>> print(up) 
[1, 0, 0, 0, 0] 
>>> extend_list(down, [0,1]) 
>>> print(down) 
[0, 1, 0, 0, 0, 1] 
+1

Ihre Ausgabe entspricht nicht was OP will. –

+0

Meine Lösung war eine Antwort auf die ursprüngliche Frage von OP. Ich finde es unfair, eine gültige Antwort auf die gestellte Frage zu verwerfen, nachdem ich Klarstellungen gefordert und den Umfang der Frage geändert habe. – BoboDarph

+0

Deshalb warten Sie zuerst auf Klarstellungen, bevor Sie antworten. –

Verwandte Themen