사전 목록에 값이 이미 있는지 확인 하시겠습니까?


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

답변:


269

한 가지 방법은 다음과 같습니다.

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
나는 그것을 찾았습니다, 그것은 List Comprehensions docs.python.org/2/whatsnew/2.0.html?highlight=comprehensions
sylye

2
'main_color': 'red'AND 'second_color':'blue'가 있는지 테스트 할 수 있습니까?
Florent

1
식이 true 또는 false로 평가되면 다시 반복 할 필요없이 값에 대한 작업을 수행 할 수있는 방법이 있습니까?
Bryce

데이터가 "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 개 이상의 키가있는 dic 목록의 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.