loop - python print array




使用'in'來匹配數組中的Python對象的屬性 (6)

你是否想要獲得具有特定屬性的對象列表? 如果是這樣, 列表理解是正確的方法來做到這一點。

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]

我不記得我是不是在做夢,但我似乎記得有一個功能,

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

我查看了文檔,但這種東西不屬於任何明顯的列表標題


我所想的可以通過列表理解來實現,但是我認為有一個函數可以稍微整理一下。

即“酒吧”是一個對象的列表,所有的對象具有屬性“ID”

神話功能方式:

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

列表理解方式:

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

回想起來,列表的理解方式是非常整齊的。


你總是可以自己寫一個:

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

將與迭代的任何東西一起工作,無論是元組,列表還是其他任何東西。

我喜歡python,它使得這樣的東西非常簡單,沒有必要的麻煩,使用這樣的東西是非常優雅的。


如果你打算搜索任何規模偏大的東西,你最好的辦法是使用字典或一套。 否則,你基本上必須遍歷迭代器的每個元素,直到你到達你想要的。

如果這不一定是性能敏感的代碼,那麼列表理解的方式應該工作。 但是請注意,這是相當低效的,因為它遍歷了迭代器的每個元素,然後再次返回,直到找到想要的結果。

請記住,python有一個最有效的哈希算法。 使用它你的優勢。


你正在想的功能可能是operator.attrgettter 。 例如,要獲取包含每個對象的“id”屬性值的列表:

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

如果你想檢查列表是否包含一個id為12的對象,那麼整潔有效的(即不會不必要地迭代整個列表)的方式是:

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

如果你想在attrgetter中使用'in',而仍然保留列表的懶惰迭代:

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


不,你不是在做夢。 Python有一個非常優秀的列表理解系統,可以讓你非常優雅地操作列表,而且根據你想要完成的事情,這可以通過幾種方法來完成。 實質上,你在做的是說“對於列表中的項目,如果criteria.matches”,並且你可以迭代通過結果或轉儲結果到一個新的列表。

我將在這裡討論Dive Into Python的一個例子,因為它非常優雅,比我更聰明。 在這裡,他們獲取目錄中的文件列表,然後過濾符合正則表達式條件的所有文件的列表。

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

你可以在沒有正則表達式的情況下執行這個操作,例如你的表達式在結尾返回true以表示匹配。 還有其他的選擇,如使用filter()函數,但如果我要選擇,我會去這個。

Eric Sipple





iteration