Aşağıdaki tüm öğelerin bir listede olup olmadığı nasıl kontrol edilir?


115

Bir listede en az bir öğe olup olmadığını nasıl bulacağımla ilgili bir soru olduğunu buldum: Aşağıdaki öğelerden birinin listede
olup olmadığı nasıl kontrol edilir?

Ancak tüm öğelerin bir listede bulunup bulunmadığını bulmanın en iyi ve pitonik yolu nedir?

Belgeleri araştırırken bu çözümü buldum:

>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False

Diğer çözüm şudur:

>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False

Ama burada daha çok yazmalısın.

Başka çözüm var mı?


5
Neyin var set(smaller) <= set(larger)?
eumiro

1
Sanırım 'hepsi' ile ikinci çözümlerin bana çok iyi ve pitonik görünüyor.
Jiho Noh

Yanıtlar:


158

<=Python'daki gibi operatörler genellikle "küçük veya eşit" ten önemli ölçüde farklı bir anlama gelmeyecek şekilde geçersiz kılınmazlar. Standart kitaplığın bunu yapması alışılmadık bir durum - bana eski API gibi kokuyor.

Eşdeğer ve daha net adlandırılmış yöntemi kullanın set.issubset. Bağımsız değişkeni bir kümeye dönüştürmenize gerek olmadığını unutmayın; gerekirse bunu sizin için yapar.

set(['a', 'b']).issubset(['a', 'b', 'c'])

2
listeyi doğrudan alt kümeye bir argüman olarak aktarabileceğinizi bilmiyordum ... güzel!
tsimbalar

1
Duyguya katılıyorum, ancak aynı şey fikri <=ve issubsetanlamı konusunda oldukça iyiyim . Neden hoşlanmıyorsun?
Kirk Strauser

2
@Just: Öncelikle, <=bir küme için ne anlama geldiği belli olmadığı için, ya dokümanlara bakmadan ya da küme teorisinde ne anlama geldiğini önceden bilmeden herkes issubsetotomatik olarak ne anlama geldiğini bilir .
Glenn Maynard

2
(Uygun olmayan) alt kümenin matematiksel işlecini biliyor musunuz? temelde yuvarlak bir <=;)
dom0

bu çözümü seviyorum. bool (True: False) yerine bir dizin konumu veya liste değeri almanın bir yolu var mı?
Vlad Gulin

62

Muhtemelen setşu şekilde kullanırdım:

set(l).issuperset(set(['a','b'])) 

veya tam tersi:

set(['a','b']).issubset(set(l)) 

Bunu biraz daha okunaklı buluyorum ama aşırı öldürme olabilir. Kümeler, koleksiyonlar arasındaki birleşim / kesişim / farklılıkları hesaplamak için özellikle kullanışlıdır, ancak bu durumda en iyi seçenek olmayabilir ...


Aslında MySet.issubset(MyOtherSet)ve MySet <= MyOtherSetaynı.
Wok

1
@wok: oh bunu bilmiyordum ama <= sözdiziminin biraz kafa karıştırıcı olduğunu düşünüyorum çünkü benzer bir sözdizimi listelerle kullanılabilir, ancak çok farklı bir anlamla.
tsimbalar

3
Dahil etmenin herhangi bir set kümesinde kısmi bir sıralamayı tanımladığını hatırlarsanız, gerçekten o kadar kafa karıştırıcı değildir. <=Diziler için taşıdığı anlamı biraz kafa karıştırıcıdır : sözlüksel sıralamadan ziyade 'bir alt dizidir' anlamına gelmesi beklenebilir.
aaronasterling

1
@aaronasterling: mmm, şahsen kodu yazdığım zaman "kısmi düzen" hakkında fazla düşünmüyorum :-), ama <=dizilerle kullanmanın da bir şekilde garip hissettirdiği gerçeğine katılıyorum ...
tsimbalar

3
Burada ben söz istiyorum biraz Yakaladım koştu: Bu yöntemi kullanırsanız, olan hiçbir çiftleri anlamına gelen kümelerine listelerinizi dönüştürmek. set(['a','a']).issubset(['a'])döner True.
Orangestar

11

Bu ikisini seviyorum çünkü en mantıklı görünüyorlar, ikincisi daha kısa ve muhtemelen en hızlı (burada Python 2.7'ye geri yüklenmişset gerçek sözdizimi kullanılarak gösterilmektedir ):

all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
#   or
{'a', 'b'}.issubset({'a', 'b', 'c'})

Timeit () ile ölçtüğünüzde "tümü" çözümü en hızlıdır. Kabul edilen cevap bu olmalıdır.
Attersson

3

Ya listeleriniz şunun gibi kopyalar içeriyorsa:

v1 = ['s', 'h', 'e', 'e', 'p']
v2 = ['s', 's', 'h']

Kümeler kopya içermiyor. Dolayısıyla, aşağıdaki satır True döndürür.

set(v2).issubset(v1)

Yinelemeleri saymak için şu kodu kullanabilirsiniz:

v1 = sorted(v1)
v2 = sorted(v2)


def is_subseq(v2, v1):
    """Check whether v2 is a subsequence of v1."""
    it = iter(v1)
    return all(c in it for c in v2) 

Dolayısıyla, aşağıdaki satır False değerini döndürür.

is_subseq(v2, v1)

1

İnternette aradığım şey buydu ama maalesef çevrimiçi olarak değil, python yorumlayıcı üzerinde deney yaparken buldum.

>>> case  = "caseCamel"
>>> label = "Case Camel"
>>> list  = ["apple", "banana"]
>>>
>>> (case or label) in list
False
>>> list = ["apple", "caseCamel"]
>>> (case or label) in list
True
>>> (case and label) in list
False
>>> list = ["case", "caseCamel", "Case Camel"]
>>> (case and label) in list
True
>>>

ve eğer bir listede tutulan değişkenlerin uzun bir listeniz varsa sublist variable

>>>
>>> list  = ["case", "caseCamel", "Case Camel"]
>>> label = "Case Camel"
>>> case  = "caseCamel"
>>>
>>> sublist = ["unique banana", "very unique banana"]
>>>
>>> # example for if any (at least one) item contained in superset (or statement)
...
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
False
>>>
>>> sublist[0] = label
>>>
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
True
>>>
>>> # example for whether a subset (all items) contained in superset (and statement)
...
>>> # a bit of demorgan's law
...
>>> next((False for item in sublist if item not in list), True)
False
>>>
>>> sublist[1] = case
>>>
>>> next((False for item in sublist if item not in list), True)
True
>>>
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
True
>>>
>>>

0

Bunun bir lambda ifadesi kullanarak nasıl yapılacağına dair bir örnek şöyle olacaktır:

issublist = lambda x, y: 0 in [_ in x for _ in y]

1
Lütfen cevabınızı açıklamak / detaylandırmak için yorum ekleyin
Sharad

0

OP'nin durumu değil, ancak - diktlerde kesişme iddiasında bulunmak isteyen ve Google'da kötü arama nedeniyle burada sona eren herkes için (örneğin ben) - çalışmanız gerekenler dict.items:

>>> a = {'key': 'value'}
>>> b = {'key': 'value', 'extra_key': 'extra_value'}
>>> all(item in a.items() for item in b.items())
True
>>> all(item in b.items() for item in a.items())
False

Bunun nedeni dict.items, anahtar / değer çiftlerinin demetlerini döndürmesidir ve Python'daki herhangi bir nesne gibi, birbirlerinin yerine karşılaştırılabilirler

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.