3

Python では、次のように要素がリストに含まれているかどうかをテストできます。

elem = 56
long_list = ["foo", "bar", asdf, 56, False]
print(elem in long_list) # "True"

これは次と同等です。

elem = 56
long_list = ["foo", "bar", asdf, 56, False]

result = False
for candidate in long_list:
    if elem == candidate:
        result = True
        break
print(result) # "True"

等しいelem == candidateかどうかをテストすることに注意してください。

私がやりたいのは、代わりに使用して身元をテストすることです。elem is candidatePythonでこれを行う最も簡単な方法は何ですか?

Google で検索してみましたが、残念ながら「is」と「in」という単語があまりにも一般的です。私も試しました

print(elem is in long_list)

しかし、これにより構文エラーが発生しました。

4

3 に答える 3

4

ジェネレータ式で使用anyします:

any(elem is candidate for candidate in long_list)
于 2013-03-22T20:46:39.657 に答える
2

私は質問を誤解しているかもしれませんが、オブジェクトが実装されていない場合は、__eq__デフォルトでID比較が必要になります。in==

class Foo:
    pass

a = Foo()
b = Foo()
c = Foo()

print (a in [a,b]) # True 
print (c in [a,b]) # False
于 2013-03-22T20:54:04.380 に答える
0

__eq__比較対象の要素がの観点から実装されている場合はis、単に使用するだけで、elem in long_list自動的に呼び出されます。したがって、これはオブジェクトで機能するはずです。

def __eq__(self, x):
    return self is x

物事を単純にするために、これstr.startswithは、同一性の代わりに(第2オペランドの)等式をオーバーロードする小さなデモです。

>>> class permissive(str):
        def __eq__(self, x):
            return self.startswith(x)

>>> mylist = map(permissive, [ "hip", "hop" ])
>>> "hi" in mylist
True

もちろん、他のコンテキストでオブジェクトが等しいかどうかを比較する場合も、同じ非常に厳密な動作が得られます。リスト内の特定のオブジェクトを見つけることだけが目的の場合は、__hash__代わりに定義して辞書に保存する必要がありますか?

于 2013-03-22T20:51:46.033 に答える