'De' kullanma dizideki Python nesne bir öznitelik eşleştirmek için

oy
39

Ben rüya yapılmadığının hatırlamıyorum ama böyle bir şey izin verilen bir fonksiyon olduğunu hatırlamıyorum görünüyor

foo in iter_attr(array of python objects, attribute name)

Ben docs yere baktım ama bu tür şeyleri görüp listelenen başlıklar altında girmemektedir

Oluştur 03/08/2008 saat 14:19
kaynak kullanıcı
Diğer dillerde...                            


8 cevaplar

oy
38

Bir liste anlama kullanarak Aranan dizisi büyükse tüm hafızayı yiyebilirim geçici liste, kuracağına. Dizisi büyük olmasa bile, liste oluşturmadan önce dizinin tamamı üzerinde iterating demektir inonun aramayı başlatabilir.

Geçici liste jeneratör ifadesini kullanarak kaçınarak olabilir:

foo = 12
foo in (obj.id for obj in bar)

Şimdi sürece obj.id == 12başlangıcında yakın bar, arama bile hızlı olacak barsonsuz uzun.

@Matt belirtildiği gibi bu kullanmak iyi bir fikir hasattrnesnelerin varsa barcan bir eksik idniteliğini:

foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))
Cevap 11/09/2008 saat 23:42
kaynak kullanıcı

oy
10

Eğer belli bir niteliği taşıdığını nesnelerin listesini almak için arıyorsunuz? Eğer öyleyse, bir liste anlama bunu yapmak için doğru yoldur.

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]
Cevap 03/08/2008 saat 16:59
kaynak kullanıcı

oy
8

Eğer her zaman bir kendini yazabiliriz:

def iterattr(iterator, attributename):
    for obj in iterator:
        yield getattr(obj, attributename)

yinelediğinden bir kayıt düzeni liste veya ne olursa olsun bir şey ile çalışacaktır.

Ben bu çok basit ve gerekli daha bir güçlük artık böyle şeyler yapar ve bunun gibi kullanımda şeyler derece zarif, piton seviyorum.

Cevap 27/08/2008 saat 21:13
kaynak kullanıcı

oy
4

Eğer düşünüyorsun fonksiyonu muhtemelen operator.attrgettter. Örneğin, her nesnenin "id" özelliğinin değeri içeren bir listesini almak için:

import operator
ids = map(operator.attrgetter("id"), bar)

Liste, daha sonra bir id == 12 bunu yapmanın bir (yani gereksiz yere tüm listeyi yineleme değildir) düzgün ve verimli bir şekilde sahip bir nesne içerip içermediğini kontrol etmek istiyorsanız:

any(obj.id == 12 for obj in bar)

Hala listenin tembel iterasyon korurken, attrgetter ile 'in' kullanmak istiyorsanız:

import operator,itertools
foo = 12
foo in itertools.imap(operator.attrgetter("id"), bar)

Cevap 05/02/2011 saat 09:10
kaynak kullanıcı

oy
4

Hayır, rüya değildi. Python oldukça zarif listeleri müdahale edebilmelerine olanak sağlayan oldukça mükemmel liste anlama sistemi vardır ve başarmak istediğiniz tam olarak ne bağlı olarak, bu birkaç yol yapılabilir. Özünde, ne söylediğini yapıyoruz "listesinde öğe için eğer criteria.matches" ve dan sadece sonuçları üzerinden yineleme ya da yeni bir liste halinde sonuçları dökümü olabilir.

Ben bir örnek beşik gidiyorum Dive Into the Python oldukça şık, çünkü burada ve onlar benden daha zekisin. İşte o zaman normal ifade kriterlere uyan tüm dosyalar için listeyi filtreleyerek, bir dizindeki dosyaların listesini alıyoruz.

    files = os.listdir(path)                               
    test = re.compile("test\.py$", re.IGNORECASE)          
    files = [f for f in files if test.search(f)]

Sen sonunda ifadesi bir maç için de geçerlidir döndüren şey için, sizin örneğin, düzenli ifadeler olmadan bunu yapabilir. Orada filtre () işlevini kullanarak gibi diğer seçenekler de vardır, ama seçim olacak olsaydı, ben bu ile gitmek istiyorum.

Eric Sipple

Cevap 03/08/2008 saat 15:30
kaynak kullanıcı

oy
3

uzaktan iyi boyutta bir şey aramaya planlıyorsanız, en iyi bahis bir sözlük ya kümesi kullanmak olacak. Aksi takdirde, temelde istediğiniz birine elde edene kadar yineleyici her eleman arasında yineleme gerekiyor.

bu mutlaka performans duyarlı kod değilse, o zaman liste anlama yolu çalışması gerekir. Ama iterasyon her eleman gider ve onu istediğini bulduğunda kadar sonra tekrar GERİ üzerine gittiği için oldukça verimsiz olduğunu unutmayın.

Unutmayın, piton etrafında en verimli karıştırma algoritmalarından birine sahiptir. kendi yararınıza kullanın.

Cevap 27/08/2008 saat 21:30
kaynak kullanıcı

oy
3

Ne Liste comprehensions kullanılarak elde edilebilir düşünüyordum, ama ben biraz daha düzgün bir şekilde bunu bir işlev olduğunu düşündük.

yani 'çubuk' özelliğini 'id', her biri nesnelerin bir listesini sunan

Efsanevi fonksiyonel yol:

foo = 12
foo in iter_attr(bar, 'id')

Liste anlama yolu:

foo = 12
foo in [obj.id for obj in bar]

Geriye doğru bakıldığında liste anlama yolu zaten çok zarif.

Cevap 03/08/2008 saat 17:13
kaynak kullanıcı

oy
-1

Bence:

#!/bin/python
bar in dict(Foo)

Eğer düşünüyorsun budur. Belirli bir anahtar (karma tablosunun Python sürümünü) Python sözlük içinde olup olmadığını kontrol etmenin iki yolu vardır görmeye çalışırken. İlk olarak bir has_key()ikinci sözlüğe bağlanmış ve yöntem, yukarıda verilen örnek bir. Bir boolean değerini döndürür.

Bu sorunuza cevap olmalıdır.

Ve şimdi biraz konu dışı için bu kravat liste anlama önceden (biraz daha netlik için) verilen cevap. Liste comprehensions Bir temel bir liste oluşturmak döngü düzenleyici kullanılmış. Bir örnek olarak, kullanmak için bir yol (biraz açıklık getirmek) in dictbir dil yapısı liste anlama :

Bir iki boyutlu bir sözlük olduğunu varsayalım foove sadece anahtarı içermesi İkinci boyut sözlükleri istiyorum bar. Bunu yapmak için nispeten basit yolu kullanmak olacaktır liste anlama aşağıdaki gibi bir şartlı ile:

#!/bin/python
baz = dict([(key, value) for key, value in foo if bar in value])

Not if bar in valuedeyimi ** sonunda, bu söyleyen bir modifiye deyimdir liste anlama sadece koşullu karşılayan bu anahtar-değer çiftleri tutmak için. ** Bu durumda bazfoo sadece sözlükleri içeren yeni sözlüğü Umarım bu kod örneğinde şey kaçırmadık (bar içeren ... sen bulundu liste anlama belgelerine bakmak gerekebilir docs.python.org öğreticiler ve en secnetix.de , her iki site iyi referanslar ise şunlardır ileride sorularım var.).

Cevap 03/08/2008 saat 16:47
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more