2012-03-18 9 views
49

, aşağıdaki önerileri listesi var: Birlikte aşağıdaki kodda aValidList yerine neListenin bir öğesinin bir liste olup olmadığı nasıl kontrol edilir (Python'da)?

list = ['UMM', 'Uma', ['Ulaster','Ulter']] 

ben listedeki bir elemanın kendisi liste olup olmadığını öğrenmek gerekiyorsa,?

for e in list: 
    if e == aValidList: 
     return True 

Özel bir kullanımı var mı? Bir değişken/elemanın bir liste olup olmadığını kontrol etmenin en iyi yolu var mı?

+1

olası bir kopyası [Bir değişken bir liste veya tup olup olmadığını test edin] (http://stackoverflow.com/questions/2184955/test-if-a-variable-is-a-list-or-tuple) –

+1

Neden Buna ihtiyacın var mı? Listeni düzleştirmeye mi çalışıyorsun? –

+4

Ayrıca: * (1) * 'List' değişken adında kullanmayın, çünkü yerleşik 'list()' i gölgeleyecektir. * (2) * Bu yuvarlak parantezlerin anlamı ne olmalıdır? –

cevap

92

Kullanım isinstance:

if isinstance(e, list): 

Eğer isinstance birkaç dersleri geçme, bir nesne, bir liste veya tuple olup olmadığını kontrol etmek istiyorsanız: olabilmektedir aradığınız

if isinstance(e, (list, tuple)): 
6

İfade:

... 
return any(isinstance(e, list) for e in my_list) 

Test:

Bir list spesifik özellikleri, ürün olmasını istediğini
>>> my_list = [1,2] 
>>> any(isinstance(e, list) for e in my_list) 
False 
>>> my_list = [1,2, [3,4,5]] 
>>> any(isinstance(e, list) for e in my_list) 
True 
>>> 
+1

Muhtemelen, sorudaki "list" adlı değişkenin "liste" türünü gizleyeceğine, yani burada yapıştırılan diğer cevapların çoğunun sadece yapıştırılmışsa başarısız olacağını vurgulamaya değer. (Ne sıklıkta utanıyorum) tarafından bir bit.) –

+0

+1, bazı for-loop-if kombinasyonu yerine 'any()' kullanmak için. – Christoph

20
  1. Çalışma dışarı. Endekslenebilir olmaları gerekiyor mu? Dilimlenebilir? .append() yöntemine mi ihtiyaçları var?

  2. collections modülünde söz konusu türün türünü açıklayan özet taban sınıfına bakın.

  3. Kullanım isinstance:

    isinstance(x, collections.MutableSequence) 
    

Isteyebilir "neden olmasın sadece type(x) == list kullanılır?" Bunu yapmamalısınız çünkü o zaman listeler gibi görünen şeyleri desteklemezsiniz. Ve Python zihniyetin parçası duck typing geçerli: Ben diyoruz

Ben ördek gibi yürüyorsa ve ördek gibi yüzer ve ördek gibi quacks bir kuş görmek kuş başka deyişle bir ördek

o Nesnelerin ihtiyaç duyacağınız metotlara sahip olmaları için list s olması gerekmez. collections modülü, Java arabirimleri gibi bir dizi soyut temel sınıf sağlar. Örneğin, collections.Sequence örneğidir, endeksleme desteklenir.

+0

Soyut Baseclass referansı ('collections.MutableSequence ',' liste 'için doğrudur, ancak burada ana referanstır), bu cevabı okuyan ve merak eden kişiler için: http://docs.python.org/library/collections.html # collections-abstract-base-classes – ninjagecko

+2

@ninjagecko yep bu bağlantı # 2 =) – katrielalex

+1

@Alex tavsiyeniz teknik olarak doğrudur, ancak genellikle gerekli olmayan ekstra çalışma gerektirir. Neden sadece isinstance (x, list) 'yi kullanmıyoruz? Bu basit, standart bir uygulamadır ve iyi uygulama olarak kabul edilir. Artı, arayüzleri ve ABC'leri düşünmek yeni başlayan bir programcıya saldırmak gibi bir olasılıktır. Sürekli olarak kullanmak için çok fazla sorun varsa "daha iyi" bir çözüm en iyi uygulama değildir. – alexis

İlgili konular