Saya memiliki beberapa masalah dengan salinan Daftar:
Jadi Setelah aku E0
dari 'get_edge'
, saya membuat salinan E0
dengan menelepon 'E0_copy = list(E0)'
. Di sini saya kira E0_copy
adalah salinan yang dalam E0
, dan saya E0_copy
masuki 'karger(E)'
. Namun dalam fungsi utama.
Mengapa hasil 'print E0[1:10]'
sebelum for for tidak sama dengan setelah for for?
Di bawah ini adalah kode saya:
def get_graph():
f=open('kargerMinCut.txt')
G={}
for line in f:
ints = [int(x) for x in line.split()]
G[ints[0]]=ints[1:len(ints)]
return G
def get_edge(G):
E=[]
for i in range(1,201):
for v in G[i]:
if v>i:
E.append([i,v])
print id(E)
return E
def karger(E):
import random
count=200
while 1:
if count == 2:
break
edge = random.randint(0,len(E)-1)
v0=E[edge][0]
v1=E[edge][1]
E.pop(edge)
if v0 != v1:
count -= 1
i=0
while 1:
if i == len(E):
break
if E[i][0] == v1:
E[i][0] = v0
if E[i][1] == v1:
E[i][1] = v0
if E[i][0] == E[i][1]:
E.pop(i)
i-=1
i+=1
mincut=len(E)
return mincut
if __name__=="__main__":
import copy
G = get_graph()
results=[]
E0 = get_edge(G)
print E0[1:10] ## this result is not equal to print2
for k in range(1,5):
E0_copy=list(E0) ## I guess here E0_coypy is a deep copy of E0
results.append(karger(E0_copy))
#print "the result is %d" %min(results)
print E0[1:10] ## this is print2
Jawaban:
E0_copy
bukan salinan yang dalam. Anda tidak membuat salinan dalam menggunakanlist()
(Keduanyalist(...)
dantestList[:]
merupakan salinan dangkal).Anda gunakan
copy.deepcopy(...)
untuk menyalin daftar secara mendalam.Lihat cuplikan berikut -
Sekarang lihat
deepcopy
operasinyasumber
Saya percaya banyak programmer telah mengalami satu atau dua masalah wawancara di mana mereka diminta untuk menyalin daftar terkait, tetapi masalah ini lebih sulit daripada kedengarannya!
dalam python, ada modul yang disebut "copy" dengan dua fungsi yang bermanfaat
copy () adalah fungsi salin dangkal, jika argumen yang diberikan adalah struktur data majemuk, misalnya daftar , maka python akan membuat objek lain dengan tipe yang sama (dalam hal ini, daftar baru ) tetapi untuk semua yang ada di dalam daftar lama, hanya referensi mereka yang disalin
Secara intuitif, kita dapat mengasumsikan bahwa deepcopy () akan mengikuti paradigma yang sama, dan satu-satunya perbedaan adalah bahwa untuk setiap elem kita akan secara rekursif memanggil deepcopy , (seperti jawaban dari mbcoder)
tapi ini salah!
deepcopy () sebenarnya mempertahankan struktur grafis dari data senyawa asli:
ini adalah bagian yang sulit, selama proses deepcopy () hashtable (kamus dengan python) digunakan untuk memetakan: "old_object ref ke new_object ref", ini mencegah duplikat yang tidak perlu dan dengan demikian mempertahankan struktur data gabungan yang disalin
dokumen resmi
sumber
Jika konten daftar adalah tipe data primitif, Anda dapat menggunakan pemahaman
Anda dapat membuat sarang untuk daftar multidimensi seperti:
sumber
Jika Anda
list elements
adalahimmutable objects
maka Anda dapat menggunakan ini, jika tidak, anda harus menggunakandeepcopy
daricopy
modul.Anda juga dapat menggunakan cara terpendek untuk menyalin dalam
list
seperti ini.sumber
hanya fungsi salin dalam rekursif.
Sunting: Seperti yang disebutkan Cfreak, ini sudah diimplementasikan dalam
copy
modul.sumber
deepcopy()
fungsi standar dalamcopy
modulMengenai daftar sebagai pohon, deep_copy dalam python dapat ditulis paling ringkas
sumber
Berikut adalah contoh cara menyalin daftar:
sumber
Ini lebih pythonic
CATATAN: Ini tidak aman dengan daftar objek yang dirujuk
sumber