Bir sözlükten bir öğeyi değerine göre, yani öğenin anahtarı bilinmediğinde, kaldırmanın en iyi yolu nedir? İşte basit bir yaklaşım:
for key, item in some_dict.items():
if item is item_to_remove:
del some_dict[key]
Daha iyi yollar var mı? Sözlüğü yinelerken sözlükteki öğeleri değiştirmenin (silmenin) yanlış bir tarafı var mı?
Şu anda nesne kimliğini test ettiğinizi unutmayın (is
yalnızca her iki işlenen de bellekte aynı nesne tarafından temsil ediliyorsa True
döndürür - bu, ==
ile eşit karşılaştırılan iki nesne için her zaman geçerli değildir). Eğer bunu bilerek yapıyorsanız, kodunuzu şu şekilde yeniden yazabilirsiniz
some_dict = {key: value for key, value in some_dict.items()
if value is not value_to_remove}
Ancak bu istediğiniz şeyi yapmayabilir:
>>> some_dict = {1: "Hello", 2: "Goodbye", 3: "You say yes", 4: "I say no"}
>>> value_to_remove = "You say yes"
>>> some_dict = {key: value for key, value in some_dict.items() if value is not value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 3: 'You say yes', 4: 'I say no'}
>>> some_dict = {key: value for key, value in some_dict.items() if value != value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 4: 'I say no'}
Bu yüzden muhtemelen is not
yerine !=
istiyorsunuz.
items()bir liste döndürür ve yinelediğiniz bu listedir, bu nedenle döngüdeki dict'i mutasyona uğratmak burada önemli değildir. Bunun yerine
iteritems()kullanıyor olsaydınız, döngüde dict'i mutasyona uğratmak [sorunlu olurdu][1] ve aynı şekilde Python 2.7'deki
viewitems()` için de.
Bir dict'ten öğeleri değere göre kaldırmanın daha iyi bir yolunu düşünemiyorum.
Önerdiğiniz gibi, yineleme sırasında sözlükten öğe silmenin yanlış bir tarafı yoktur. Aynı sözlüğü aynı anda kullanan birden fazla iş parçacığı konusunda dikkatli olun, bu bir KeyError veya başka sorunlara neden olabilir.
Elbette, http://docs.python.org/library/stdtypes.html#typesmapping adresindeki belgelere bakın