私はこれに遭遇しました:
item = someSortOfSelection()
if item in myList:
doMySpecialFunction(item)
しかし、時々それがリストの中で認識されなかったかのように(それが文字列のリストである時)私のすべてのアイテムでうまくいかない。
これは、リストから項目を見つけるための最も「Pythonic」な方法ですか?if x in l:
?
あなたの最初の質問に関しては:そのコードは完璧で、item
がmyList
内の要素の1つに等しい場合にはうまくいくはずです。たぶんあなたは 正確に のいずれかの項目にマッチしない文字列を見つけようとしているか、多分あなたは不正確さに苦しんでいるfloat値を使っています。
あなたの2番目の質問に関しては:リストの中のものを「見つける」なら実際にはいくつかの可能な方法があります。
これはあなたが記述するユースケースです:何かがリストの中にあるかどうかをチェックする。ご存じのとおり、そのためにin
演算子を使用できます。
3 in [1, 2, 3] # => True
つまり、特定の条件を満たすシーケンス内のすべての要素を見つけることです。そのためにはリスト内包表記やジェネレータ式を使うことができます。
matches = [x for x in lst if fulfills_some_condition(x)]
matches = (x for x in lst if x > 6)
後者は generator を返すでしょう。これは一種の遅延リストとして想像することができ、それはあなたがそれを繰り返すとすぐに構築されます。ちなみに、最初のものは完全に同等です
matches = filter(fulfills_some_condition, lst)
ここでは、高階関数が機能していることがわかります。 Python 3では、filter
はリストを返さず、ジェネレータのようなオブジェクトを返します。
最初に条件に一致するものだけが欲しい場合(しかし、それがまだ何なのかわからない場合)、forループを使用するのが賢明です(おそらくelse
節も使用しますが、これはあまり知られていません)。また使用することができます
next(x for x in lst if ...)
最初の一致を返すか、何も見つからなければStopIteration
を送出します。あるいは、あなたは使うことができます
next((x for x in lst if ...), [default value])
リストの場合、index
メソッドもあります。これは、 ここで 特定の要素がリスト内にあることを知りたい場合に便利です。
[1,2,3].index(2) # => 1
[1,2,3].index(4) # => ValueError
ただし、重複がある場合、.index
は常に最も低いインデックスを返します。
[1,2,3,2].index(2) # => 1
重複があり、すべてのインデックスが必要な場合は、代わりにenumerate()
を使用できます。
[i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3]
1つの要素を見つけたい場合、またはNone
がデフォルトでnext
を使用する場合、項目がリストに見つからなかった場合でもStopIteration
は発生しません。
first_or_default = next((x for x in lst if ...), None)
Niklas B.からの回答は非常に包括的ですが、リストから項目を見つけたいときには、そのインデックスを取得すると便利なことがあります。
next((i for i, x in enumerate(lst) if [condition on x]), [default value])
最初の出現箇所を見つける
そのためのレシピがitertools
にあります。
def first_true(iterable, default=False, pred=None):
"""Returns the first true value in the iterable.
If no true value is found, returns *default*
If *pred* is not None, returns the first item
for which pred(item) is true.
"""
# first_true([a,b,c], x) --> a or b or c or x
# first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
return next(filter(pred, iterable), default)
たとえば、次のコードはリストの最初の奇数を見つけます。
>>> first_true([2,3,4,5], None, lambda x: x%2==1)
3
もう1つの選択肢:if item in list:
を使って項目がリストにあるかどうかを確認できますが、これは順序O(n)です。もしあなたがアイテムの大きなリストを扱っていて、あなたが知る必要があるのは何かがあなたのリストのメンバーであるかどうかだけであるなら、あなたは最初にリストをセットに変換して 一定時間セット検索 を利用することができます:
my_set = set(my_list)
if item in my_set: # much faster on average than using a list
# do something
どのような場合でも正しい解決策になるわけではありませんが、場合によってはパフォーマンスが向上することがあります。
set(my_list)
を使ってセットを作成することもO(n)であることに注意してください。したがって、これを一度だけ実行する必要があるのであれば、この方法で実行するのはそれほど速くありません。ただし、メンバーシップを繰り返し確認する必要がある場合は、最初のセットを作成した後のすべての検索に対して、これはO(1)です。
list = [10, 20, 30, 40, 50]
n = int(input("\nEnter a Number to search from the list : "))
if n in list :
print("\nMatch found")
else :
print("\nMatch not found")
リストにxが見つかった場合はxのインデックスを返し、xが見つからない場合は#ValueError
メッセージを返すlist.index(x)
を使用する代わりに、リスト内のxの出現回数を返すlist.count(x)
を使用できます(xが実際にリストにあることの検証それ以外の場合は(xがない場合は)0を返します。 count()
のいいところは、コードが壊れたり、xが見つからない場合に例外をスローする必要がないということです。
定義と使い方
count()
メソッドは、指定された値を持つ要素の数を返します。
構文
list.count(value)
例:
fruits = ['Apple', 'banana', 'cherry']
x = fruits.count("cherry")
質問の例:
item = someSortOfSelection()
if myList.count(item) >= 1 :
doMySpecialFunction(item)
文字列のリストの項目に追加/不要な空白がないことを確認してください。
文字列のリストを扱う際には、2つの可能な検索のうちの1つを使用することができます。
リスト要素が項目と 等しい の場合( 'example'は ['one'、 'example'、 'two']にあります):
if item in your_list: some_function_on_true()
'' ex 'in [' one '、' ex '、' two '] => True
['one'、 'ex'、 'two']の 'ex_1' => False
リスト要素が like の場合( 'ex'は ['one、' example '、' two ']または' example_1 'は [' one 'の中'example'、 'two']):
matches = [el for el in your_list if item in el]
または
matches = [el for el in your_list if el in item]
len(matches)
をチェックするか、必要ならばそれらを読むだけです。