2014-04-05 28 views
11

Bu sanırım mutable olarak ayarlanmış olabilir.Bir öğeden bir öğe nasıl kaldırılır?

Temel olarak, set.discard(element) kullanarak bir öğeden bir öğeyi kaldırabilirim. Ancak, set.discard(element)'un kendisi None döndürür. Ama güncellenmiş kümenin bir kopyasını almak istiyorum. Örneğin, bir dizi setim varsa, liste kavrama işlemlerini kullanarak güncellenmiş bir kopyasını rahatlıkla nasıl edinebilirim?

örnek kod: Sen set difference operator kullanabilirsiniz

[None, None] 
[set(['a']), set(['b'])] 
+0

SOF böyle muhteşem bir yerdir! Hem @ thefourtheye hem de @roippi cevapları güzel çalışıyor! @roippi cevabı hız avantajına sahiptir ve daha geniş bir uygulamaya sahip olabilir. Ben sadece @fourtheye cevabını kabul ettim çünkü bu durum benim durumumda elverişli olduğu için, set listesinin bir liste listesinden oluşturulduğu anlamına gelir. Bu yüzden ben sadece '[set (x) - {''} x listesindeki kodu yazabilirim. Ama ikinize de çok teşekkürler! –

+0

Liste kavraması, orijinal setlerde değişiklik yapılmadan setlerin bağımsız bir listesiyle sonuçlanıyor mu, yoksa orijinali değiştirmeli mi? Orijinali değiştirmek isterseniz, liste kavramasını hiç kullanmamak en iyisidir; bir 'for' döngüsü daha uygundur. – user2357112

+0

@ user2357112 Orijinali değiştirmek istiyorum (gerçekten önemli değil ama veri kümesi büyük olduğundan, kopya oluşturmak istemiyorum). Bu durumda 'döngü için' neden liste anlamadan daha iyi? –

cevap

7

sadece yerinde çalışan bir yöntemle kısıtlı hissediyorum zaman

test = [{'', 'a'}, {'b', ''}] 
print [x.discard('') for x in test] 
print test 

bu

test, empty = [{'', 'a'}, {'b', ''}], {''} 
print [x - empty for x in test] 
# [set(['a']), set(['b'])] 
+1

Bu, OP'nin gerçek problemini iyi çözebilir, ancak orijinal kümeleri değiştirmediğinden, sorusunda istediği şeyden semantik olarak farklıdır. –

+0

@AdrianRatnapala ile aynı fikirdeyim ve roippi'nin doğru cevabı olduğunu düşünüyorum. –

9

gibi dönecektir , or/and davranışını kullanabilirsiniz. ve istediğiniz semantik.

[x.discard('') or x for x in test] 

Bu teknik aksi imkansız olduğu bir lambda (tek bir ifade ile sınırlıdır veya diğer durumlarda) şeyler ulaşmak için zaman zaman yararlıdır. o en "okunabilir" veya "pythonic" dir tartışılabilir :-)

+3

Bu durumda sol tarafa 'x 'koymamaya dikkat edin veya' or' ifadesi kısa devreye girecek ve mutasyon asla oluşmayacaktır. [x veya x.discard ('') x test için] == [{'', 'a'}, {'', 'b'}] ' –

0

Bu? (@thefourtheye cevabın yinelenen)

set çıkarma operasyonu set verileri döndürür olsun.

test = [{'', 'a'}, {'b', ''}] 
print [x - {''} for x in test] 
print test 

Çıktı:

[set(['a']), set(['b'])] 
[set(['a', '']), set(['', 'b'])] 
İlgili konular