0

それ自体がリストであるmgmt_classesという属性を持つオブジェクトのリストがあります。

systems = [System, System, System,...]
System.mgmt_classes = ['foo','bar']

'foo'という名前のmgmt_classを持つシステムリスト内のSystemオブジェクトを識別したいと思います。私はそれを行うための2つの方法を思いついたが、どちらも好きではない。

醜いリスト内包

matching = [system for system in systems 
            if len([mc for mc in system.mgmt_classes 
                    if re.search(search, mc)]) > 0]

醜いネストされたループ

matching = []
for system in systems:
    for mgmt_class in system.mgmt_classes:
        if re.search(search, mgmt_class):
            matching.append(system)

どちらも好きではありません。これを行うためのよりエレガントな方法はありますか?私の腸は、醜いネストされたループは、従うのが簡単なので、2つのより良い解決策になるだろうと私に言っています。

編集

mgmt_classesで部分的な用語を検索できるようにしたいので、たとえば「foo」は「food」または「football」を取得します。

4

2 に答える 2

4

一致基準が洗練されている場合は、次のような別の関数にそれを因数分解することを検討してください。

systems = [System, System, System,...]
System.mgmt_classes = ['foo','bar']

def hasmatches(classes):
    return any(re.search(search, mc) for mc in classes)

matching = [system for system in systems
    if hasmatches(system.mgmt_classes)]

hasmatchesクラスのリストで最初に一致するものが見つかったときにTrueを返し、一致しない場合はFalseを返します。次に、リスト内包表記は各システムでそれを呼び出し、hasmatchesTrueと評価されたものを収集します。

特定の値を探すのと同じくらい簡単な場合は、正規表現を失い、文字列を直接比較します。

matching = [system for system in systems if 'foo' in system.mgmt_classes]
于 2013-01-08T04:02:38.123 に答える
4
matching = [system for system in systems if 'foo' in system.mgmt_classes]

このステートメントは、が属性にあるifかどうかをチェックします。これは、正規表現を使用するよりもはるかに簡単です。'foo'mgmt_classes

ただし、条件で正規表現を使用する必要がある場合は、次を使用してください。

matching = [system for system in systems if any(re.search('foo', i) for i in system.mgmt_classes)]

これは、カークの答えの単なるワンライナーバージョンです。

于 2013-01-08T04:03:27.013 に答える