“|” Kullanmadan bir satıra iki set nasıl katılır?


171

Varsayalım Sve Tatanmış kümeler. Join operatörünü kullanmadan, |iki setin birleşimini nasıl bulabilirim? Örneğin bu kesişim noktasını bulur:

S = {1, 2, 3, 4}
T = {3, 4, 5, 6}
S_intersect_T = { i for i in S if i in T }

Peki iki setin birleşimini bir satırda kullanmadan nasıl bulabilirim |?


1
sendikaya ihtiyacın var mı Evet ise s.union (t)
Ansuman Bebarta

59
Neden kullanamıyorsun |?
Scott Bartell

1
Kullanmamak için genel bir neden var |mı?
Ocak Matanster

5
Bunun bir nedeni, ayarlanmış bir işlemi bir işlev argümanı olarak geçirmek olabilir. Gibi bir işlevi, bir şey düşünün: def apply_set_operation(a, b, set_operation). Bu işlevi çağırarak, ben tercih ediyorum apply_set_operation(a, b, set.union)içinapply_set_operation(a, b, set.__or__)
bsa

Yanıtlar:


309

Kümeler için birleşim yöntemini kullanabilirsiniz: set.union(other_set)

Yeni bir küme döndürdüğünü, yani kendisini değiştirmediğini unutmayın.


54
Ancak, |değişken satır içi değiştirebilirsiniz:set_a |= set_b
jorgenkg

13
aynı @jorgenkg: set_a = set_a.union(set_b). Eğer "yerinde" demek, ne yapacağız, hem yeni oluşturursanızset
nitely

3
@jorgenkg hala yeni bir küme oluşturur ve referansın yerini alır.
Alvaro

3
@Alvaro @ basit bir teste göre: a = set((1, 2, 3,)); b = set((1, 3, 4,)); id_a = id(a); a |= b; assert id_a == id(a)@jorgenkg doğrudur - değişken asatır içi değiştirilir. Bir şey mi kaçırıyorum?
johndodo

3
Hayır, buna benzemiyor: a = set((1, 2, 3,)); b = set((1, 3, 4,)); c = a; a |= b; assert id(c) == id(a). aYok colsaydı bile olmazdı. Ayrıca, cşimdi set([1, 2, 3, 4]), bu yüzden @ jorgenkg adlı kullanıcının yorumu doğru.
johndodo

45

or_Takma ad kullanabilirsiniz :

>>> from operator import or_
>>> from functools import reduce # python3 required
>>> reduce(or_, [{1, 2, 3, 4}, {3, 4, 5, 6}])
set([1, 2, 3, 4, 5, 6])

9
Bu yaklaşımı seviyorum, daha işlevsel ve 2 veya daha fazla sete uygulanabilir.
Colin Su

42

Orijinal seti değiştirmede sorun yaşıyorsanız (bazı durumlarda yapmak isteyebilirsiniz), şunları kullanabilirsiniz set.update():

S.update(T)

Dönüş değeri None, ancak Sorijinal Sile birliği olacak şekilde güncellenecektir T.


23

Ayrıca kullanamayacağınızı varsayarsak, buna s.union(t)eşdeğerdir s | t,

>>> from itertools import chain
>>> set(chain(s,t))
set([1, 2, 3, 4, 5, 6])

Veya bir anlayış istiyorsanız,

>>> {i for j in (s,t) for i in j}
set([1, 2, 3, 4, 5, 6])

14

Katılmak demek sendika demekse şunu deneyin:

set(list(s) + list(t))

Biraz hack, ama bunu yapmak için daha iyi bir astar düşünemiyorum.


set (list (ler) + list (t)) bir birleşim yaparsanız aynı sonucu verir.
Ansuman Bebarta

Biliyorum, ama o yerleşik python fonksiyonlarını kullanmaktan kaçınmaya çalışıyor gibi görünüyor, aksi takdirde sadece kullanılmış | Şebeke.
BenjaminCohen

listve setpython fonksiyonları inşa edilmiştir
whackamadoodle3000

10

Diyelim ki 2 listeniz var

 A = [1,2,3,4]
 B = [3,4,5,6]

böylece ABirliği Başağıdaki gibi bulabilirsiniz

 union = set(A).union(set(B))

ayrıca kavşak ve kavşak bulmak istemiyorsanız bunu aşağıdaki gibi yapın

 intersection = set(A).intersection(set(B))
 non_intersection = union - intersection

7

Her iki seti de şu şekilde açabilirsiniz:

>>> set_1 = {1, 2, 3, 4}
>>> set_2 = {3, 4, 5, 6}
>>> union = {*set_1, *set_2}
>>> union
{1, 2, 3, 4, 5, 6}

*Set açar. Ambalajdan çıkarma, yinelenebilir bir öğenin (örn. Bir küme veya liste) verdiği her öğe olarak temsil edildiği yerdir. Bu araçlar için yukarıdaki örnek kolaylık imkanına {1, 2, 3, 4, 3, 4, 5, 6}ardından kolaylaştırırsak hangi {1, 2, 3, 4, 5, 6}seti eşsiz öğeleri yalnızca içerebileceği için.


*3. satırda ne yapar ?
altabq

5

Sen yapabilir unionveya basit liste anlama

[A.add(_) for _ in B]

A, B'nin tüm unsurlarına sahip olacaktır.


yan etkiler için ve anonim param ile liste kavrayışı kullanmak süper kötü bir uygulamadır.
Jean-François Fabre
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.