2016-08-02 2 views
1

Wie stelle ich mehrere Generatorausdrücke als Eingabe für Pythons join Methode? Ich habe folgendes versucht, was nicht funktioniert. Gibt es einen Unterschied bei der Verwendung von Python 2.x und 3.x? Meine genaue Version ist Python 2.7.12.Wie man Generatorausdrücke als Eingabe in Pythons Join-Methode setzt?

def productList(self, obj): 
    return ", ".join([w.name for w in obj.someProducts.all()],[w.code 
         for w in obj.someProducts.all()]) 

und ohne die Eingabe []

def productList(self, obj): 
     return ", ".join(w.name for w in obj.someProducts.all(),w.code 
         for w in obj.someProducts.all()) 

:

Product table 
    Name: Char; 
    Code: Char; 

Ausgang:

name1code1, name2code2 
+2

Was möchten Sie haben? Es sollte nur einen Generatorausdruck geben - und er muss Zeichenfolgen generieren. Gib uns etwas Input/Output. – Bahrom

+1

Sie haben den Ausdruck List-Comprehension oder Generator in jedem Ihrer Join-Aufrufe dupliziert. Willst du wirklich alle Namen zweimal? – Blckknght

+0

Entschuldigung Ich habe meine Frage bearbeitet Ich muss Name und Code für das Produkt anzeigen. – Devone

Antwort

2

Wenn Sie Namen und den Code anzeigen möchten, müssen Sie nur kombinieren Sie brauchen nicht tw o Generatoren.

', '.join(w.name + ':' + w.code for w in obj.someProducts.all()) 

oder String-Formatierung:

', '.join('{name}: {code}'.format(name=w.name, code=w.code) for w in obj.someProducts.all()) 

Oder eine andere join (nicht empfohlen, es sei denn Sie es einen Generator geben kann - eine andere Liste zu schaffen, ist eine Verschwendung, aber dies zeigt, wie Sie können Nest Joins)

', '.join(':'.join([w.name, w.code]) for w in obj.someProducts.all()) 

auf einer Seite zur Kenntnis, Python 3.6 stellt Literal String Interpolation, was bedeutet, dass Sie in der Lage sein sollten, so etwas zu tun (ich das zu Hause würde testen, da ich bei wor nicht über 3,6 k; könnte jemand das überprüfen funktioniert tatsächlich. Lassen Sie mich wissen, wenn es nicht der Fall ist, ich es entfernen werde):

', '.join(f'{w.name}: {w.code}' for w in obj.someProducts.all()) 
+1

Ich würde "str.format" als eine viel natürlichere Art der Kombination der beiden Attribute vorschlagen, anstatt einen zusätzlichen 'Join'-Aufruf. – Blckknght

+0

Messestand, aktualisiert, danke! – Bahrom

2

Probieren Sie es:

', '.join('{}{}'.format(w.name, w.code) for w in obj.someProducts.all()) 

Ich habe gerade die w.name und w.code eine Saite, dass So brauchst du keine 2 Listen. Ändern Sie das Format wie gewünscht.