2

Info という名前のクラスがあり、Info には文字列型のインスタンス変数があり、Info.getName()

などのインスタンス情報のリストもありますclass_list = [Info('Aleck'), Info('John')]

を指定すると、name_list と同じ名前のclass_listname_list = ['Aleck', 'Bob']の要素を削除したいのですが、名前 (Bob など) が class_list にないかどうかも知る必要があります (たとえば、bob がリストにないことを出力します)

上記の例では、結果は class_list = [Info('John')] になり、bob がリストにないことが出力されます。

次のコードのような醜い方法を知っています(実際には実行していません。単なる例です)、これを行うためのエレガントな方法またはPythonicの方法はありますか?

def removeElement(name_list, class_list):
    list_to_be_removed = []
    for name in name_list:
        is_name_in_list = false
        for obj in class_list
            if name == obj.getName():
                list_to_be_removed.add(obj)
                is_name_in_list = true
                break
        if is_name_in_list == false:
            print name + ' is not in the list'
        is_name_in_list = false

    for obj in list_to_be_removed:
        class_list.remove(obj)
4

2 に答える 2

5

クラスはありません。クラス インスタンスがあります。Info('Alice')Info クラスのインスタンスを作成するコンストラクター呼び出しです。

これはどう:

filtered = [info for info in info_list if info.get_name() not in name_list]

または:

filtered = filter(lambda o: o not in name_list, info_list)

名前がたくさんある場合は、name_list をセットに変換して使用します。

name_set = set(name_list)
于 2013-01-10T03:06:49.177 に答える
4

リスト内包表記はあなたの友達です。

def remove_names(names_to_remove, info_list):
    return [info
            for info in info_list
            if info.getName() not in names_to_remove]

ほとんどの変数の名前を、あなたの意図に近いものに変更しました。

于 2013-01-10T03:05:14.207 に答える