2016-12-13 8 views
0

Ich bin neu in Python und vielleicht ist dies nicht logisch klingen, aber wie kann ich das machen arbeiten:Wie fügt man Python-Einträge dynamisch zu einer Liste hinzu?

p1=(20,50) 
p2=(70,80) 
p3=(100,140) 
listP=[] 
#listP=[p1,p2,p3] #manually it works 
for i in range(3): 
    listP.append('p'+str(i)) 

Das Ergebnis sollte eine Liste des Punktes sein, an Stelle von (P1, P2 usw.) Vielen Dank im Voraus!

+4

Warum man sie als Liste nicht definieren? – TigerhawkT3

+0

* manuell funktioniert es * - wie Sie geschrieben haben, kann manuelle Aktion eine Lösung werden. Zeigen Sie, wie der endgültige Listeninhalt aussehen sollte – RomanPerekhrest

Antwort

1

In Ihrem Beispiel sind p1, p2, p3Identifikatoren, aber in Ihrem for -loop, fügen Sie die Namen dieser Bezeichner als Strings auf Ihrer Liste. Folglich erhalten Sie eine Liste von Zeichenfolgen und keine Liste der dereferenzierten Werte für Bezeichner, die diesen Zeichenfolgen entsprechen. Dieses Verhalten ist beabsichtigt und erwünscht.

Bezeichner sind benannte Bezeichner, die Sie in Ihrem Code verwenden, um auf die Werte zuzugreifen, auf die sie verweisen. Im Allgemeinen konvertiert keine Programmiersprache Zeichenfolgen, die mit einigen lokalen Bezeichnern übereinstimmen, automatisch in tatsächliche Bezüge, da dies in den meisten Fällen ein unbeabsichtigtes Verhalten ist. Denken Sie an Umfang und Sicherheit.

Normalerweise sollten Sie nicht versuchen, Zeichenfolgen in Bezeichner umzuwandeln. In Python können Sie dazu getattr verwenden. Allerdings werde ich dies hier nicht skizzieren, denn wieder sollten Sie nicht tun.

Der bessere Ansatz für Ihren Fall direkt auf Ihre Punkte in einem list oder dict Struktur instanziiert:

# List: 
plist = [(20, 50), (70, 80), (100, 140)] 

# Dict: 
pdict = { 
    'p1': (20, 50), 
    'p2': (70, 80), 
    'p3': (100, 140) 
} 

In diesen Fällen Sie Ihre Punkte wie so zugreifen können:

# For list case: 
for i in range(3): 
    print(plist[i]) 

# For dict case: 
for i in range(3): 
    print(pdict['p{:d}'.format(i)]) 
+0

Vereinbart, dass die Verwendung von Wörterbüchern scheint der richtige Ansatz. Aber manchmal ist es auch hilfreich zu wissen, wie man dynamisch auf Variablennamen zugreift. –

+0

Das Erstellen von Variablennamen als Strings und dynamisches Dereferenzieren von Variablen ist eine schlechte Kodierung auf fast allen Ebenen. In der Tat ist es schön zu wissen, aber normalerweise deutet es auf einen großen Konstruktionsfehler hin, wenn Sie es tun müssen. Was ist mit Debugging, Refactoring, Inspektion (um nur einige zu nennen)? – jbndlr

+0

Sehr einverstanden, eine Design-/Algorithmusänderung im Programm ist erforderlich. –

1

Wenn Sie möchten auf Variablen zugreifen, indem Sie ihre Namen als Zeichenfolgen verwenden. Sie können hierzu locals() oder vars() (danke @Wingston Sharon) verwenden:

statt unabhängig genannten Variablen in erster Linie
# Using locals() 
for i in range(3): 
    listP.append(locals()['p' + str(i)]) 

# Using vars() 
for i in range(3): 
    listP.append(vars()['p' + str(i)]) 
+1

Dies ist eine Lösung Y für Problem X (siehe [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)) und eine sehr hacky Lösung bei diesem. – TigerhawkT3

1

können Sie verwenden vars()

for i in range(1,4): 
    listP.append(vars()['p'+str(i)]) 
+0

Schön, ich habe 'vars()' vermisst. – Fejs

+1

Dies ist eine Lösung Y für Problem X (siehe [XY-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)) und eine sehr hacky Lösung dabei. – TigerhawkT3

Verwandte Themen