Python nicht unterstützen ein Tupel zu einer Liste hinzu:Warum kann ich einer Liste mit dem Operator '+' in Python kein Tupel hinzufügen?
>>> [1,2,3] + (4,5,6)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list
Was sind die Nachteile für die Bereitstellung einer solchen Unterstützung in der Sprache? Beachten Sie, dass ich erwarte, dass dies symmetrisch ist: [1, 2] + (3, 4)
und (1, 2) + [3, 4]
würden beide zu einer brandneuen Liste [1, 2, 3, 4]
bewerten. Mein Grundgedanke ist, dass, sobald jemand operator + auf eine Mischung aus Tupeln und Listen angewendet hat, diese wahrscheinlich erneut (sehr wahrscheinlich in demselben Ausdruck) ausgeführt werden, sodass wir die Liste auch bereitstellen könnten, um zusätzliche Conversions zu vermeiden.
Hier ist meine Motivation für diese Frage.
Es passiert ziemlich oft, dass ich kleine Sammlungen habe, die ich lieber als Tupel speichern möchte, um versehentliche Änderungen zu vermeiden und die Leistung zu verbessern. Ich muss dann solche Tupel mit Listen kombinieren, und jede davon in eine Liste umwandeln zu müssen, macht einen sehr hässlichen Code.
Beachten Sie, dass +=
oder extend
in einfachen Fällen funktionieren kann. Aber im Allgemeinen, wenn ich einen Ausdruck habe
Ich weiß nicht, welche dieser Tupel und welche Listen sind. Also entweder ich muss alles auf Listen konvertieren:
columns = list(default_columns) + list(columns_from_user) + list(calculated_columns)
oder benutzen itertools:
columns = list(itertools.chain(default_columns, columns_from_user, calculated_columns))
Beide Lösungen sind hässlicher als eine einfache Summe; und die chain
kann auch langsamer sein (da sie die Eingänge ein Element auf einmal durchlaufen muss).
Wie wäre es, einfach konsistent zu sein? Verwenden Sie Tupel oder Verwendungslisten, aber nicht beide. –
Wenn es _at all_ unterstützt würde, würde ich zustimmen, dass das das beste Verhalten wäre, aber ich denke, wenn jemand '2 + 'abc' macht, wollen sie eindeutig' '2abc'' also warum nicht zulassen, etc. etc. - - Es ist zu viel Interpretation. Explizit ist besser als implizit. – agf
Sie könnten einfach "itertools.chain" verwenden, um Ihre Sachen zu verketten und niemals '+' stattdessen verwenden. – hochl