辞書のリスト内に値がすでに存在するかどうかを確認しますか?


122

次のように、Pythonの辞書リストがあります。

a = [
    {'main_color': 'red', 'second_color':'blue'},
    {'main_color': 'yellow', 'second_color':'green'},
    {'main_color': 'yellow', 'second_color':'blue'},
]

次のように、特定のキー/値を持つディクショナリがリストにすでに存在するかどうかを確認したいと思います。

// is a dict with 'main_color'='red' in the list already?
// if not: add item

回答:


268

これを行う1つの方法を次に示します。

if not any(d['main_color'] == 'red' for d in a):
    # does not exist

括弧内の部分は、True探しているキーと値のペアを持つディクショナリごとに返すジェネレータ式で、それ以外の場合はFalseです。


キーも欠落している可能性がある場合は、上記のコードでを取得できますKeyError。これを修正getするには、デフォルト値を使用して提供します。デフォルト値を指定しない場合Noneは、が返されます。

if not any(d.get('main_color', default_value) == 'red' for d in a):
    # does not exist

驚くべきワンライナー構文、私はこれのために一生懸命見ています!「for」の前に「for」の操作を実際に配置できることを示すPythonのドキュメントのどこにあるのでしょうか。
sylye

1
私はそれを見つけました、それはリスト補完
sylye

2
'main_color': 'red'AND 'second_color':'blue'が存在するかどうかをテストする可能性はありますか?
フロラン

1
式がtrueまたはfalseに評価されたら、再度ループすることなく値に対してアクションを実行する方法はありますか?
ブライス

データが「null」[{"main_color":null、 "second_color": "red"}、{"main_color:" green "、" second_color ":" null "}]に付属している場合は機能しません
Ashok Sri

5

多分これは役立ちます:

a = [{ 'main_color': 'red', 'second_color':'blue'},
     { 'main_color': 'yellow', 'second_color':'green'},
     { 'main_color': 'yellow', 'second_color':'blue'}]

def in_dictlist((key, value), my_dictlist):
    for this in my_dictlist:
        if this[key] == value:
            return this
    return {}

print in_dictlist(('main_color','red'), a)
print in_dictlist(('main_color','pink'), a)

3

おそらく、これらの線に沿った関数はあなたが求めているものです:

 def add_unique_to_dict_list(dict_list, key, value):
  for d in dict_list:
     if key in d:
        return d[key]

  dict_list.append({ key: value })
  return value

1

@Mark Byersのすばらしい回答に基づいており、@ Florentの質問に続いて、2つ以上のキーを持つdicsのリストの2つの条件でも機能することを示しています。

names = []
names.append({'first': 'Nil', 'last': 'Elliot', 'suffix': 'III'})
names.append({'first': 'Max', 'last': 'Sam', 'suffix': 'IX'})
names.append({'first': 'Anthony', 'last': 'Mark', 'suffix': 'IX'})

if not any(d['first'] == 'Anthony' and d['last'] == 'Mark' for d in names):

    print('Not exists!')
else:
    print('Exists!')

結果:

Exists!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.