50

次のようなdictのリストがあるとします。

[{1: "a"}, {2: "b"}]

特定のキーがリストのdictの1つにあるかどうかを示すためのpythonicの方法は何ですか?

4

6 に答える 6

104

私はおそらく書くだろう:

>>> 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]
于 2013-02-09T20:04:51.253 に答える
5

単一の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
于 2017-06-23T10:34:29.837 に答える
3

anyジェネレーターで関数を使用します。

>>> d = [{1: "a"}, {2: "b"}]
>>> any(1 in x for x in d)
True

any関数に渡されたTrue要素の少なくとも1つがである場合、関数はを返します。しかし、あなたは本当に考慮する必要があります、なぜあなたは単一の中にすべてのペアを持っていないのですか?iterableTruekey: valuedict

于 2013-02-09T20:05:10.177 に答える
2
parsedData=[]
dataRow={}
if not any(d['url'] == dataRow['url'] for d in self.parsedData):
       self.parsedData.append(dataRow)
于 2015-01-16T05:26:34.040 に答える
0

深くネストされたデータ構造を検索するために、このコードを使用して、リストと辞書の両方でキーを再帰的に検索しました

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
于 2019-05-12T10:37:55.283 に答える
-3

python2とpython3で何が可能だったかに驚かされました。python3でやったことに基づいて答えます。私の目的は単純でした。辞書形式のjson応答でエラーが発生したかどうかを確認してください。私の辞書は「トークン」と呼ばれ、私が探している鍵は「エラー」です。

if ((token.get('error', None)) is None):
    do something

キー「エラー」を探しています。存在しない場合は、値をNoneに設定し、値がNoneであるかどうかを確認します。その場合は、コードを続行します。キー「エラー」がある場合に処理するelseステートメント

于 2020-01-03T16:18:41.853 に答える