2009-06-30 8 views
3

Ich habe eine Liste wie:Ändern Listeninhalte in Python

list = [[1,2,3],[4,5,6],[7,8,9]] 

Ich möchte programmatisch eine Nummer zu Beginn eines jeden Wert in der Liste anhängen, sagen die Nummer 9. Ich die neue Liste wollen sei wie:

list = [[9,1,2,3],[9,4,5,6],[9,7,8,9]] 

Wie gehe ich dabei in Python? Ich weiß, dass es eine sehr triviale Frage ist, aber ich konnte keinen Weg finden, dies zu tun.

Antwort

16
for sublist in thelist: 
    sublist.insert(0, 9) 

nicht Verwendung eingebaute Namen wie list für Ihre eigenen Sachen, das ist nur ein dummer Unfall in der Herstellung - Aufruf Ihre Sachen mylist oder thelist oder dergleichen, nichtlist.

bearbeiten: als die OP aks wie> 1 Element eingefügt werden zu Beginn eines jeden sublist, lassen Sie mich darauf hinweisen, dass der effizienteste Weg durch Zuordnung der mehrere Elemente zu einer Scheibe jede Teilliste (die meisten Liste Mutatoren können als lesbar Alternativen gesehen werden Zuweisungen in Scheiben schneiden ;-), das heißt:

for sublist in thelist: 
    sublist[0:0] = 8, 9 

sublist[0:0] ist die leere Scheibe am Anfang sublist und durch Elemente es zuweisen Sie die Einzelteile an derselben Stelle sind das Einfügen .

+0

Danke für die Antwort ... Nur ein Addendum zu der Frage. Was, wenn ich zwei anstelle von einer Nummer einfügen möchte. Wie möchte ich 9,8 am Anfang jedes Elements in der Liste einfügen? – Aamir

+0

@Aamir: call insert() mehrmals, oder weniger effizient, verketten die Listen: '[9,8] + Unterliste. –

+2

@Amir: oder, am effizientesten, die leere Scheibe am Anfang zuweisen - lassen Sie mich die Antwort bearbeiten, um das zu zeigen. –

2

die Insert-Methode verwenden, die die Liste anstelle modifiziert:

oder mehr erschöpfende

[numberlist.insert(0,9) for numberlist in numberlists] 

oder anders, indem Liste Verkettung, die erstellt eine neue Liste

>>> numberlists = [[1,2,3],[4,5,6]] 
>>> for numberlist in numberlists: 
... numberlist.insert(0,9) 
... 
>>> numberlists 
[[9, 1, 2, 3], [9, 4, 5, 6]] 

newnumberlists = [[9] + numberlist for numberlist in numberlists] 
+1

Das Listenverständnis, das Sie vorschlagen, als "Succint" baut und ignoriert eine Liste von 'None's - yech! -) –

+0

Ich bin mir dessen bewusst. Ich habe es gerade nicht erwähnt :-) –

12
>>> someList = [[1,2,3],[4,5,6],[7,8,9]] 
>>> someList = [[9] + i for i in someList] 
>>> someList 
[[9, 1, 2, 3], [9, 4, 5, 6], [9, 7, 8, 9]] 

(someList weil die Liste bereits von Python verwendet wird)

+0

Woot! TMTOWTDI in Python !! :) –

+0

Wir gehen nicht um Alternativen zu verbieten! -) OTOH, meine Insert-basierte Lösung ist besser und allgemein, so wird es "der" offensichtliche Weg, es für Programmierer fortgeschritten genug, um Microbenchmark Dinge zu machen (zB mit python -mtimeit) ODER mit den Interna vertraut sein ;-). –

+0

Nun, ich erwarte insert() schneller zu sein, es sei denn, Sie wollen tatsächlich eine Kopie erstellen –

0
#!/usr/bin/env python 

def addNine(val): 
    val.insert(0,9) 
    return val 

if __name__ == '__main__': 
    s = [[1,2,3],[4,5,6],[7,8,9]] 
    print map(addNine,s) 

Ausgang:

[[9, 1, 2, 3], [9, 4, 5, 6], [9, 7, 8, 9]] 
2

Wenn Sie vorhaben, viel Prepending zu tun,
vielleicht mit deques * anstelle von Listen betrachten:

>>> mylist = [[1,2,3],[4,5,6],[7,8,9]] 

>>> from collections import deque 
>>> mydeque = deque() 
>>> for li in mylist: 
... mydeque.append(deque(li)) 
... 
>>> mydeque 
deque([deque([1, 2, 3]), deque([4, 5, 6]), deque([7, 8, 9])]) 
>>> for di in mydeque: 
... di.appendleft(9) 
... 
>>> mydeque 
deque([deque([9, 1, 2, 3]), deque([9, 4, 5, 6]), deque([9, 7, 8, 9])]) 

* Deques sind Verallgemeinerung von Stacks und Queues (der Name wird "Deck" ausgesprochen und ist die Abkürzung für "Double-ended queue"). Deques unterstützen thread-sichere, memory-effiziente Attends und Pops von jeder Seite der Deque mit ungefähr der gleichen O (1) Performance in beide Richtungen.

Und, wie andere barmherzig erwähnt haben:
Für die Liebe aller Dinge langweilig und hässlich,
bitte nicht Namen Variablen nach Ihren Lieblingsdatenstrukturen.