2010-02-23 11 views
40

Değer Hiçbiri değilse, onu "" (boş dize) olarak değiştirmek istiyorum.Python'da, sözlüğe nasıl girerim ve bir şeye eşitse değeri nasıl değiştiririm?

Böyle başlamak, ama ben unutmak:

for k, v in mydict.items(): 
    if v is None: 
... right? 
+8

Bu bir sahte veya bir trol veya bir atlayış silahı 1 Nisan gag mıdır yoksa SO "itibar" sisteminde büyük bir eksiklik örneği midir? –

+2

Bence yorumlarınız OP tbh için daha fazla rep üretir. –

+6

@JohnMachin: Bunun neden bir trol olduğunu düşündüğünüzden emin değilim - faydalı bir soru buldum ve görünüşe göre 17 kişi aynı fikirde. Bunu yaparken bir dict'i güncelleyip güncelleyemediğimi görmek istedim, bu yüzden bu soruyu bana getiren 'python yineleme dict güncelleme değerlerini' aradım. Bana aradığım cevabı veren bir yorum içerir. Dilbilgisi ve biçimlendirme çok iyi değil, ama iyi bir soru, oylamaya değer. –

cevap

95
for k, v in mydict.iteritems(): 
    if v is None: 
     mydict[k] = '' 

Daha genel bir durumda, örneğin Anahtarlar ekliyor veya kaldırıyorsanız, döngü yaptığınız kabın yapısını değiştirmek güvenli olmayabilir. Bu nedenle, bağımsız bir liste kopyasında döngü yapmak için items kullanılması ihtiyatlı olabilir - ancak farklı bir değere Varolan dizin verilen herhangi bir soruna neden olur, bu nedenle, Python 2.any, iteritems kullanmak daha iyidir.

+0

belki s/index/key/ –

+0

@John, _any_ built-in ** container ** için geçerlidir - bir dict gibi bir listeye kadar - ve bence "index" daha genel bir terimdir "anahtar". –

+2

'mydict [k] = ''' - örnek güncellemeniz 'k' endeksini değişmez bir nesneye, ''' '. Bundan sonra, '' '' '' 'v'den tamamen farklı bir nesneyi işaret eder. Bu, 'k 'endeksi bir şekilde' .iteritems() 'ile ilgili sorunlara neden olacak şekilde değiştirir mi? – CivFan

7

comprehensions genellikle daha hızlıdır ve bu yineleme sırasında mydict düzenleme değil avantajına sahiptir: Sen değerleri Yok sadece elemanların dict anlama yaratabilir

mydict = dict((k, v if v else '') for k, v in mydict.items()) 
+0

Eğer' .items() 'kullanıyorsanız, fark etmez (python2 için) eğer' mydict'ı değiştirirseniz listeyi '.items()' döndürürseniz bile ekleyemezsiniz. 'mydict' tuşları –

+3

Sadece bir dict değerlerini değiştirmek asla bir problem değildir; Keder dict üzerinde yineleme yaparken KEYS ekleyerek/silerek neden olur. Anlamalar WHAT'den daha mı hızlı? Gerçekten hızlı: Bir ya da iki Nones değiştiğinde tüm kararsızlığı kopyalamak. Nones'den bahsetmişken, eğer 'v 'ise v değil ise' Yok 'ise' (tekrar oku) olmalısınız. Genel özeti: -1 –

12

ve sonra geri güncelleştirmek orijinal:

tmp = dict((k,"") for k,v in mydict.iteritems() if v is None) 
mydict.update(tmp) 

Güncelleme - did bazı performans testleri

100'den 10.000'e kadar olan öğelerin diktelerini denedikten sonra, değişken değerlerin Yüzde değeriyle, Alex'in çözümünün performansı bu çözümün iki katı kadar hızlı.

+0

Hmm, Python 2 için.7 Aynı performansı görüyorum (Alex'in yöntemi her zaman daha hızlı olsa da); 1000 .. 100000 değeri ile dikte denedim ve% 2 ile% 50 arasında bir yüzdelik hiçbiri yok; Karşılaştırma için, [buckley] (http://stackoverflow.com/a/2315545/558008) (s/items/iteritems/ile) yöntemi yaklaşık 4 kat daha yavaştı. Bence bu ilginç bir şey, çünkü formunuz iterasyonda sözlüğü değiştirmeye izin veriyor. –

İlgili konular