사전이 주어지면 해당 사전의 주어진 키가 이미 아닌 값으로 설정되었는지 어떻게 알 수 있습니까?
즉, 나는 이것을하고 싶다 :
my_dict = {}
if (my_dict[key] != None):
my_dict[key] = 1
else:
my_dict[key] += 1
즉, 이미 값이 있으면 값을 늘리거나 그렇지 않으면 1로 설정하고 싶습니다.
사전이 주어지면 해당 사전의 주어진 키가 이미 아닌 값으로 설정되었는지 어떻게 알 수 있습니까?
즉, 나는 이것을하고 싶다 :
my_dict = {}
if (my_dict[key] != None):
my_dict[key] = 1
else:
my_dict[key] += 1
즉, 이미 값이 있으면 값을 늘리거나 그렇지 않으면 1로 설정하고 싶습니다.
답변:
찾고 있습니다 collections.defaultdict
(Python 2.5 이상에서 사용 가능). 이
from collections import defaultdict
my_dict = defaultdict(int)
my_dict[key] += 1
당신이 원하는 것을 할 것입니다.
일반 파이썬 dict
의 경우 주어진 키에 대한 값이 없으면 dict에 액세스 할 때 얻을 수 없습니다 . 따라서 코드 대신 일반을 사용 하려면None
KeyError
dict
if key in my_dict:
my_dict[key] += 1
else:
my_dict[key] = 1
dict
으로 할 수 있습니다 my_dict[key] = my_dict.get(key, 0) + 1
.
그 key in dict
관용구 가 필요합니다 .
if key in my_dict and not (my_dict[key] is None):
# do something
else:
# do something else
그러나 defaultdict
(dF가 제안한대로) 사용을 고려해야 합니다.
my_dict[key] is not None
(적어도 IMHO) 명확하다,
if key in my_dict and my_dict[key]:
" 그 dict의 주어진 색인이 이미 None이 아닌 값으로 설정되어 있는지 어떻게 알 수 있습니까?"라는 질문에 대답하려면 다음 을 선호합니다.
try:
nonNone = my_dict[key] is not None
except KeyError:
nonNone = False
이것은 이미 호출 된 EAFP 개념 (용서를 요청한 후 허가하기가 더 쉬움)을 준수합니다. 또한 key in my_dict and my_dict[key] is not None
조회 비용이 비싸면 흥미로운 점에서와 같이 사전에서 중복 키 조회를 피합니다 .
실제 문제 가 발생 하면 int가 있으면 int를 늘리거나 그렇지 않으면 기본값으로 설정하십시오.
my_dict[key] = my_dict.get(key, default) + 1
앤드류 윌킨슨의 대답 에서처럼.
사전에 수정 가능한 객체를 저장하는 경우 세 번째 해결책이 있습니다. 이에 대한 일반적인 예는 키의 요소 목록을 저장하는 멀티 맵 입니다. 이 경우 다음을 사용할 수 있습니다.
my_dict.setdefault(key, []).append(item)
사전에 키 값이 존재하지 않으면 setdefault 메소드는이를 setdefault의 두 번째 매개 변수로 설정합니다. 표준 my_dict [key]처럼 동작하며 키 값 (새로 설정 한 값일 수 있음)을 반환합니다.
cgoldberg와 동의 함. 내가하는 방법 :
try:
dict[key] += 1
except KeyError:
dict[key] = 1
따라서 위와 같이하거나 다른 사람들이 제안한대로 기본 dict를 사용하십시오. if 문을 사용하지 마십시오. 그것은 파이썬이 아닙니다.
+=2
또는 -=1
? 두 줄을 모두 변경해야합니다. 지금은 사소한 일처럼 보일지 모르지만, 당신을 물기 위해 돌아올 수있는 바보 같은 작은 사소한 버그입니다.
많은 답변에서 볼 수 있듯이 몇 가지 솔루션이 있습니다. has_key () 메소드 인 LBYL의 한 인스턴스 (도약하기 전에 살펴보기)는 아직 언급되지 않았습니다.
my_dict = {}
def add (key):
if my_dict.has_key(key):
my_dict[key] += 1
else:
my_dict[key] = 1
if __name__ == '__main__':
add("foo")
add("bar")
add("foo")
print my_dict
당신이 그것을 시도하는 방법은 당신이 가치를 높이기 전에 조건을 확인하기 때문에 LBYL (도약 전에 봐라)이라고합니다.
다른 방법은 EAFP (용서를 요청한 후 허가를 받기가 더 쉽다)라고합니다. 이 경우 작업을 시도하면됩니다 (값 증가). 실패하면 예외를 포착하고 값을 1로 설정하십시오. 이것은 약간 더 파이썬적인 방법입니다 (IMO).
http://mail.python.org/pipermail/python-list/2003-May/205182.html
조금 늦었지만 이것은 효과가 있습니다.
my_dict = {}
my_dict[key] = my_dict[key] + 1 if key in my_dict else 1
이것은 질문에 직접 대답하지는 않지만 collections.Counter 의 기능을 원할 것 같습니다 .
from collections import Counter
to_count = ["foo", "foo", "bar", "baz", "foo", "bar"]
count = Counter(to_count)
print(count)
print("acts just like the desired dictionary:")
print("bar occurs {} times".format(count["bar"]))
print("any item that does not occur in the list is set to 0:")
print("dog occurs {} times".format(count["dog"]))
print("can iterate over items from most frequent to least:")
for item, times in count.most_common():
print("{} occurs {} times".format(item, times))
결과적으로 출력
Counter({'foo': 3, 'bar': 2, 'baz': 1})
acts just like the desired dictionary:
bar occurs 2 times
any item that does not occur in the list is set to 0:
dog occurs 0 times
can iterate over items from most frequent to least:
foo occurs 3 times
bar occurs 2 times
baz occurs 1 times
defaultdict(int)
일부 추가 기능 과 마찬가지로 작동하므로 정수를 다룰 때 완벽하게 작동하지만 관련 동작을 표시하지 않습니다.
최근 에이 문제를 해결하기 위해 생각해 낸 하나의 라이너가 있습니다. setdefault 사전 방법을 기반으로합니다 .
my_dict = {}
my_dict[key] = my_dict.setdefault(key, 0) + 1
나는 그것을 찾고 있었고, 웹에서 그것을 찾지 못했고 Try / Error로 운을 시험해 보았습니다.
my_dict = {}
if my_dict.__contains__(some_key):
my_dict[some_key] += 1
else:
my_dict[some_key] = 1
__contains__
프로덕션 코드에서는 사용하지 않아야 합니다. btw. __contains__
를 사용하는 것과 같습니다 is
.
my_dict.__contains__(some_key)
행 equivelent 인 some_key in my_dict
, 과부하 인 in
운전자는 없다is