2017-06-21 1 views
2

Ich habe ein Tupel ähnlicheauspacken Teile eines Tupels in Tupel

t = (1, '0076', 'AU', '9927016803A', '9927013903B', '0010', 'VO') 

und ich möchte die ersten 6 Werte als Tupel extrahieren (um) und der letzte Wert als Zeichenfolge zurück.

Der folgende Code funktioniert bereits, aber ich frage mich, ob es einen "Einzeiler" zu erreichen, was ich suche.

# works, but it's not nice to unpack each value individually 
cid,sc,ma,comp,mat,step,alt = t 
t_new = (cid,sc,ma,comp,mat,step,) 
print(t_new, alt) # (1, '0076', 'AU', '9927016803A', '9927013903B', '0010') VO 

Das ist ganz in der Nähe zu dem, was ich suche, aber es gibt die ersten Werte als Liste statt eines Tupels:

# works, but returns list 
*t_new,alt = t 
print(t_new, alt) # [1, '0076', 'AU', '9927016803A', '9927013903B', '0010'] VO 

Ich habe folgendes schon versucht, aber w/o Erfolg:

tuple(*t_new),alt = t # SyntaxError 
(*t_new),alt = t # still a list 
(*t_new,),alt = t # ValueError 

Wenn es nicht anders geht, werde ich wohl mit meinem zweiten Versuch gehen und die Liste zu einem Tupel geworfen.

Antwort

4

warum nicht einfach:

t = (1, '0076', 'AU', '9927016803A', '9927013903B', '0010', 'VO') 

t_new, alt = t[:-1], t[-1] 
print(t_new, alt) # (1, '0076', 'AU', '9927016803A', '9927013903B', '0010') VO 
+0

Es ist nie fiel mir ein, dass ich gerade wie eine Liste ein Tupel in Scheiben schneiden kann. Das ist der eine Liner, nach dem ich suche. –

2

Entweder es gerade wieder zu einem Tupel konvertieren wie Sie gesagt haben:

*t_new, alt = t 
t_new = tuple(t_new) 

Oder nur Slicing verwenden:

t_new = t[:-1] # Will be a tuple 
alt = t[-1] 

Wenn Sie möchten, um Effizienz, Tupel Packen/Entpacken sprechen ist relativ langsam im Vergleich zum Slicing sollte der untere also der schnellste sein.

1

Wenn Sie immer zuerst 6 Werte in neuen Tupel haben wollen:

t = (1, '0076', 'AU', '9927016803A', '9927013903B', '0010', 'VO') 
newT = t[0:6] 
Verwandte Themen