次のようなdictのリストがあるとします。
[{1: "a"}, {2: "b"}]
特定のキーがリストのdictの1つにあるかどうかを示すためのpythonicの方法は何ですか?
次のようなdictのリストがあるとします。
[{1: "a"}, {2: "b"}]
特定のキーがリストのdictの1つにあるかどうかを示すためのpythonicの方法は何ですか?
私はおそらく書くだろう:
>>> lod = [{1: "a"}, {2: "b"}]
>>> any(1 in d for d in lod)
True
>>> any(3 in d for d in lod)
False
ただし、このリストに多くのdictが含まれる場合は、データ構造を再検討することをお勧めします。
最初に一致するものが見つかったインデックスや辞書が必要な場合は、次の方法を使用することをお勧めしnext
ますenumerate
。
>>> next(i for i,d in enumerate(lod) if 1 in d)
0
>>> next(d for i,d in enumerate(lod) if 1 in d)
{1: 'a'}
>>> next((i,d) for i,d in enumerate(lod) if 1 in d)
(0, {1: 'a'})
StopIteration
そこにない場合、これは発生します:
>>> next(i for i,d in enumerate(lod) if 3 in d)
Traceback (most recent call last):
File "<ipython-input-107-1f0737b2eae0>", line 1, in <module>
next(i for i,d in enumerate(lod) if 3 in d)
StopIteration
これを回避したい場合は、例外をキャッチするか、次のnext
ようなデフォルト値を渡すことができますNone
。
>>> next((i for i,d in enumerate(lod) if 3 in d), None)
>>>
@drewkのコメントに記載されているように、複数の値の場合に複数のインデックスが返されるようにしたい場合は、リスト内包表記を使用できます。
>>> lod = [{1: "a"}, {2: "b"}, {2: "c"}]
>>> [i for i,d in enumerate(lod) if 2 in d]
[1, 2]
単一のdictorayで表示するには、「in」キーワードを使用します。
key in dic_instance
辞書のリストをチェックインするには、辞書リストを反復処理し、「any」関数を使用します。これにより、いずれかの辞書でキーが見つかった場合、リストはそれ以上反復されません。
dic_list = [{1: "a"}, {2: "b"}]
any(2 in d for d in dic_list)
True
any(4 in d for d in dic_list)
False
any
ジェネレーターで関数を使用します。
>>> d = [{1: "a"}, {2: "b"}]
>>> any(1 in x for x in d)
True
any
関数に渡されたTrue
要素の少なくとも1つがである場合、関数はを返します。しかし、あなたは本当に考慮する必要があります、なぜあなたは単一の中にすべてのペアを持っていないのですか?iterable
True
key: value
dict
parsedData=[]
dataRow={}
if not any(d['url'] == dataRow['url'] for d in self.parsedData):
self.parsedData.append(dataRow)
深くネストされたデータ構造を検索するために、このコードを使用して、リストと辞書の両方でキーを再帰的に検索しました
def isKey(dictORlist, key):
# dictORlist is the data structure you want to search
# key is the keyword you want to search for
def checkList(List, key):
if isinstance(List, list):
for i in List:
return isKey(i, key)
result = checkList(dictORlist, key)
if isinstance(dictORlist, dict):
for k in dictORlist.keys():
data = dictORlist[k]
if k == key:
return True
elif isinstance(data, dict):
result = isKey(data, key)
else:
result = checkList(data, key)
if result == None:
result = False
return result
python2とpython3で何が可能だったかに驚かされました。python3でやったことに基づいて答えます。私の目的は単純でした。辞書形式のjson応答でエラーが発生したかどうかを確認してください。私の辞書は「トークン」と呼ばれ、私が探している鍵は「エラー」です。
if ((token.get('error', None)) is None):
do something
キー「エラー」を探しています。存在しない場合は、値をNoneに設定し、値がNoneであるかどうかを確認します。その場合は、コードを続行します。キー「エラー」がある場合に処理するelseステートメント