it-swarm.com.de

Wie kopiere ich eine Liste am besten?

Wie kopiere ich eine Liste am besten? Ich kenne folgende Möglichkeiten, welche ist besser? Oder gibt es einen anderen Weg?

lst = ['one', 2, 3]

lst1 = list(lst)

lst2 = lst[:]

import copy
lst3 = copy.copy(lst)
55
sheats

Wenn Sie eine flache Kopie wünschen (Elemente werden nicht kopiert), verwenden Sie:

lst2=lst1[:]

Wenn Sie eine tiefe Kopie erstellen möchten, verwenden Sie das Kopiermodul:

import copy
lst2=copy.deepcopy(lst1)
90
Mark Roddy

Ich benutze oft:

lst2 = lst1 * 1

Wenn lst1 andere Container enthält (wie auch andere Listen), sollten Sie deepcopy aus der copy lib verwenden, wie von Mark gezeigt.


UPDATE: Erklärt Deepcopy

>>> a = range(5)
>>> b = a*1
>>> a,b
([0, 1, 2, 3, 4], [0, 1, 2, 3, 4])
>>> a[2] = 55 
>>> a,b
([0, 1, 55, 3, 4], [0, 1, 2, 3, 4])

Da sieht man vielleicht nur eine geänderte ... Ich werde es jetzt mit einer Liste von Listen versuchen

>>> 
>>> a = [range(i,i+3) for i in range(3)]
>>> a
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
>>> b = a*1
>>> a,b
([[0, 1, 2], [1, 2, 3], [2, 3, 4]], [[0, 1, 2], [1, 2, 3], [2, 3, 4]])

Nicht so lesbar, lass es mich drucken mit einem für:

>>> for i in (a,b): print i   
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
>>> a[1].append('appended')
>>> for i in (a,b): print i

[[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]]
[[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]]

Siehst du das? Es wurde auch an b [1] angehängt, so dass b [1] und a [1] dasselbe Objekt sind. Probieren Sie es jetzt mit deepcopy aus

>>> from copy import deepcopy
>>> b = deepcopy(a)
>>> a[0].append('again...')
>>> for i in (a,b): print i

[[0, 1, 2, 'again...'], [1, 2, 3, 'appended'], [2, 3, 4]]
[[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]]
18
Andrea Ambu

Sie können auch tun:

a = [1, 2, 3]
b = list(a)
12
Martin Cote

Mache ich gerne:

lst2 = list(lst1)

Der Vorteil gegenüber lst1 [:] ist, dass dieselbe Redewendung für Dikte gilt:

dct2 = dict(dct1)
6
John Fouhy

Shortlists, [:] ist das Beste:

In [1]: l = range(10)

In [2]: %timeit list(l)
1000000 loops, best of 3: 477 ns per loop

In [3]: %timeit l[:]
1000000 loops, best of 3: 236 ns per loop

In [6]: %timeit copy(l)
1000000 loops, best of 3: 1.43 us per loop

Bei größeren Listen sind sie alle ungefähr gleich:

In [7]: l = range(50000)

In [8]: %timeit list(l)
1000 loops, best of 3: 261 us per loop

In [9]: %timeit l[:]
1000 loops, best of 3: 261 us per loop

In [10]: %timeit copy(l)
1000 loops, best of 3: 248 us per loop

Bei sehr großen Listen (ich habe 50MM ausprobiert) sind sie immer noch ungefähr gleich.

3
shakefu

Sie können dies auch tun:

import copy
list2 = copy.copy(list1)

Dies sollte dasselbe tun wie Mark Roddys flache Kopie.

2
Jason Baker

In Bezug auf die Leistung ist das Aufrufen von list() im Vergleich zum Schneiden mit einem gewissen Aufwand verbunden. Für kurze Listen ist lst2 = lst1[:] Also ungefähr doppelt so schnell wie lst2 = list(lst1).

In den meisten Fällen wird dies wahrscheinlich durch die Tatsache aufgewogen, dass list() besser lesbar ist, aber in engen Schleifen kann dies eine wertvolle Optimierung sein.

0
DNS