2016-06-05 11 views
0

Ich habe Listen, die wie folgt aussehen:fortlaufende Nummerierung auf Liste von Tupeln hinzufügen

[('A', 'B', 'C'), ('D', 'E', 'F'), ('G', 'H', 'I')] 

und was soll ich versuche, wie zu bekommen aussehen: kann

[('1', 'A', 'B', 'C'), ('2', 'D', 'E', 'F'), ('3', 'G', 'H', 'I')] 
+0

Sie müssen Informationen zu oder Code für das bereitstellen, was Sie bereits versucht haben. – Nicarus

Antwort

2

Sie aufzuzählen, um sie zu packen in 2-Tupel, und sie dann in eine Tupel Karte zurück:

my_list = [('A', 'B', 'C'), ('D', 'E', 'F'), ('G', 'H', 'I')] 
new_list = [(str(x[0]),)+x[1] for x in enumerate(my_list, start=1)] 

erstes Objekt in der Aufzählung wird sein:

Wir drehen die Zahl in ein 1-Tupel, ordnen sie in eine Zeichenkette ein und fügen dann das ursprüngliche Tupel hinzu.

EDIT: Einige verschiedene Methoden mit der Zeit hinzugefügt

my_list = [('A', 'B', 'C'), ('D', 'E', 'F'), ('G', 'H', 'I')]*1000 

new_list = [(str(x[0]+1),)+x[1] for x in enumerate(my_list)] 
## 1000 loops, best of 3: 815 µs per loop 

new_list = [(str(x[0]),)+x[1] for x in enumerate(my_list, start=1)] 
## 1000 loops, best of 3: 766 µs per loop, by schwobaseggl 

new_list = map(lambda x:(str(x[0]),)+x[1],enumerate(my_list, start=1)) 
## 1000 loops, best of 3: 989 µs per loop 

new_list = [(str(index),)+values for index, values in enumerate(my_list, start=1)] 
## 1000 loops, best of 3: 669 µs per loop, by Donkey Kong 
+0

Danke! Wird bereits verwendet, aber gibt es einen effizienteren Weg? – AD28

+0

Unwahrscheinlich, aber ich werde versuchen, andere Möglichkeiten und Zeit es :) –

+0

@ AD28 wenn Sie sehr besorgt über die Effizienz, es lohnt sich zu prüfen, ob - a) Sie brauchen dies eine Zeichenfolge und noch wichtiger b) ob Sie eigentlich wirklich benötigen eine vollständige Kopie der Liste mit zusätzlichen Kopien von Informationen, die bereits in der Liste enthalten sind. Das ist schon ziemlich ineffizient und du wirst vielleicht feststellen, dass du es komplett vermeiden kannst. – pvg

1

Verwenden Sie eine Liste Verständnis mit dem Auspacken.

In [1]: t = [('A', 'B', 'C'), ('D', 'E', 'F'), ('G', 'H', 'I')] 

In [2]: [(str(i), *j) for i, j in enumerate(t, start=1)] 
Out[2]: [('1', 'A', 'B', 'C'), ('2', 'D', 'E', 'F'), ('3', 'G', 'H', 'I')] 

Es ist auch ziemlich schnell.

In [3]: %timeit([(str(i), *j) for i, j in enumerate(t, start=1)]) 
100000 loops, best of 3: 5.91 µs per loop 

Dies funktioniert nicht in Python < 3.5. Dieses Verhalten wurde in PEP 448 eingeführt.

+0

Dies funktioniert auch nicht in Python 3 - Sie können keinen markierten Ausdruck in einem Tupel-Literal verwenden. – miradulo

+0

@DonkeyKong Es funktioniert in Python 3.5. Das, was ich verwendet habe, um die * tatsächliche IPython-Ausgabe * oben gezeigt zu generieren. –

+0

Entschuldigung, das war mir eigentlich nicht bewusst. Ich war super irritiert, weil ich dachte, du hättest Code geschrieben, als wäre es ein tatsächlicher Output, der nicht kompiliert wurde ... oops. Schöne Antwort;) – miradulo

Verwandte Themen