2015-06-09 1 views
8

Ich habe eine Liste von unbekannter Größe:auspacken Liste in Mitte eines Tupels

l = [...] 

Und ich will diese Liste in ein Tupel entpacken, die anderen Werte, aber die unten nicht:

t = ("AA", "B", *l, "C") 

Wie mache ich folgendes?

t = ("AA", "B", l[0], ..., l[:-1], "C") 

EDIT: es wäre auch schön, ein Stück zu tun, [a: b] nur:

t = ("AA", "B", l[a], ..., l[b], "C") 

Antwort

1

Ab Python 3.5 können Sie jetzt Ihren ersten Ansatz verwenden:

>>> l = [1, 2, 3] 
>>> t = ("AA", "B", *l, "C") 
>>> t 
('AA', 'B', 1, 2, 3, 'C') 

Sie Scheiben verwenden können wie man erwarten würde:

>>> ("AA", "B", *l[:-1], "C") 
('AA', 'B', 1, 2, 'C') 

Den damit verbundenen PEP, für Referenz: PEP448

8

Sie können nicht in ein Tupel auszupacken durch Werte wie das Einsetzen von (noch - siehe PEP 448), weil das Entpacken nur auf dem Ausdruck auf der linken Seite erfolgt oder wie die Fehlermeldung lautet: Zuweisungsziel.

Auch Zuweisungsziel sollte gültige Python-Variablen haben. In Ihrem Fall haben Sie String-Literale auch im Tupel.

Aber Sie können die Tupel konstruieren Sie wollten, von drei Tupel verketten, wie dieser

>>> l = [1, 2, 3, 4] 
>>> ("A", "B") + tuple(l[:-1]) + ("C",) 
('A', 'B', 1, 2, 3, 'C') 
>>> ("A", "B") + tuple(l) + ("C",) 
('A', 'B', 1, 2, 3, 4, 'C') 
+0

das funktioniert wie beabsichtigt, danke, obwohl ich denke, dass die * -Notation als Zucker unterstützt werden sollte, weil t sein ist hässlich. Ich denke, ich könnte eine Funktion schreiben, die das tut. – Tommy

0

können Sie flatten the list und dann Tupel konvertieren.

>>> import itertools 
>>> l=[1,2,3,4] 
>>> t = ('A', 'B', l, 'C') 
>>> t 
('A', 'B', [1, 2, 3, 4], 'C') 
>>> tuple(itertools.chain.from_iterable(t)) 
('A', 'B', 1, 2, 3, 4, 'C') 
>>> 
+0

Dies funktioniert nicht, wenn die Liste mehrere Zeichen wie "abc" enthält. – Tommy

+0

Rechts. Das ist das richtige Verhalten. Liste und String sind beide iterierbar. Daher wird die Zeichenfolge ähnlich wie in der Liste erweitert. Mein Fehler. – shantanoo