2 setin birleşimi tüm öğeleri içermez


94

Aşağıdaki birliklerdeki iki kümenin sırasını değiştirdiğimde nasıl farklı sonuçlar alıyorum?

set1 = {1, 2, 3}
set2 = {True, False}

print(set1 | set2)
# {False, 1, 2, 3}

print(set2 | set1)
#{False, True, 2, 3}

Yanıtlar:


110

Union () neden tüm öğeleri içermiyor?

1Ve Truedengi ve çiftleri olarak kabul vardır. Aynı şekilde 0ve Falseeşdeğerdir:

>>> 1 == True
True
>>> 0 == False
True

Hangi eşdeğer değer kullanılır

Birden çok eşdeğer değerle karşılaşıldığında, kümeler ilkini görünür tutar:

>>> {0, False}
{0}
>>> {False, 0}
{False}

Değerleri farklı kılmanın yolları

Onlara farklı muamele edilmesini sağlamak için onları bir (value, type)çift ​​halinde saklamanız yeterlidir:

>>> set1 = {(1, int), (2, int), (3, int)}
>>> set2 = {(True, bool), (False, bool)}
>>> set1 | set2
{(3, <class 'int'>), (1, <class 'int'>), (2, <class 'int'>),
 (True, <class 'bool'>), (False, <class 'bool'>)}
>>> set1 & set2
set()

Değerleri farklı kılmanın bir başka yolu da onları dizeler olarak saklamaktır:

>>> set1 = {'1', '2', '3'}
>>> set2 = {'True', 'False'}
>>> set1 | set2
{'2', '3', 'False', 'True', '1'}
>>> set1 & set2
set()

Umarım bu, gizemi ortadan kaldırır ve ileriye giden yolu gösterir :-)


Yorumlardan kurtarıldı:

Bu, türler arası eşdeğerliği kırmak için standart tekniktir (yani 0.0 == 0, True == 1ve Decimal(8.5) == 8.5). Teknik, Python 2.7'nin normal ifade modülünde, unicode regex'lerin, aksi takdirde eşdeğer str regex'lerden farklı bir şekilde önbelleğe alınmasını zorlamak için kullanılır. Bu teknik ayrıca Python'da da kullanılır. Yazılan parametre doğru olduğunda functools.lru_cache () için 3.

OP'nin varsayılan eşdeğerlik ilişkisi dışında bir şeye ihtiyacı varsa, o zaman bazı yeni ilişkilerin tanımlanması gerekir. Kullanım durumuna bağlı olarak, dizeler için büyük / küçük harfe duyarsızlık, unicode için normalleştirme, görsel görünüm (farklı görünen şeyler farklı kabul edilir), kimlik (iki farklı nesne eşit kabul edilmez), bir değer / tür çifti veya başka bir şey olabilir. eşdeğerlik ilişkisini tanımlayan işlev. OP'lerin özel örneği göz önüne alındığında, ya türe göre ayrım ya da görsel ayrım beklediği görülmektedir.


20

Python'da, Falseve 0olduğu gibi, eşdeğer kabul edilmektedir Trueve 1. Çünkü Trueve 1aynı değer olarak kabul edildiğinden, bir kümede aynı anda yalnızca biri bulunabilir. Hangisi sete eklendikleri sıraya bağlıdır. İlk satırda set1ilk set olarak kullanılır, böylece 1ortaya çıkan sete gireriz. İkinci sette, Truebirinci sette Trueolduğu için sonuca dahil edilir.


6

Eğer bakarsak https://docs.python.org/3/library/stdtypes.html#boolean-values bölüm 4.12.10. Boole Değerleri:

Boole değerleri, False ve True sabit nesneleridir . Doğruluk değerlerini temsil etmek için kullanılırlar (diğer değerler de yanlış veya doğru olarak kabul edilebilir). Sayısal bağlamlarda (örneğin bir aritmetik işleç için bağımsız değişken olarak kullanıldığında) , sırasıyla 0 ve 1 tam sayıları gibi davranırlar .


4

Karşılaştırma operatörü ( ==, !=) boole için tanımlanmıştır Trueve False1 ile 0 ile eşleşir.

Bu nedenle, set birleşiminde, Trueyeni sette olup olmadığını kontrol ettiğinde , doğru bir cevap alır:

>>> True in {1}
True
>>> 1 in {True}
True
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.