문제

사전이 주어지면 해당 사전의 주어진 키가 이미 비 값으로 설정되었는지 어떻게 알 수 있습니까?

즉, 나는 이것을하고 싶다 :

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

당신이 원하는 것을 할 것입니다.

일반 파이썬의 경우 dicts, 주어진 키에 대한 값이 없다면 ~ 아니다 가져 오기 None DICT에 액세스 할 때 -a KeyError 제기 될 것입니다. 따라서 정규를 사용하려면 dict, 당신은 당신이 사용할 코드 대신에 사용할 것입니다

if key in my_dict:
    my_dict[key] += 1
else:
    my_dict[key] = 1

다른 팁

나는 이것을 한 줄의 코드로 선호합니다.

my_dict = {}

my_dict[some_key] = my_dict.get(some_key, 0) + 1

사전에는 기능, get이 있는데, 이는 두 개의 매개 변수 (원하는 키)와 존재하지 않으면 기본값을 가져옵니다. 키가 모든 곳이 아닌이 코드 라인에 존재하지 않는 경우 만 처리하려면이 메소드를 선호합니다.

나는 개인적으로 사용하는 것을 좋아합니다 setdefault()

my_dict = {}

my_dict.setdefault(some_key, 0)
my_dict[some_key] += 1

당신은 필요합니다 key in dict 그것에 대한 관용구.

if key in my_dict and not (my_dict[key] is None):
  # do something
else:
  # do something else

그러나 사용을 고려해야합니다 defaultdict (DF가 제안한대로).

질문에 대답하려면 "해당 DICT의 주어진 인덱스가 이미 비 가치로 설정되었는지 확인할 수있는 방법", 나는 이것을 선호합니다 :

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

Andrew Wilkinson의 답변에서와 같이.

사전에 수정 가능한 객체를 저장하는 경우 세 번째 솔루션이 있습니다. 이것에 대한 일반적인 예는 a 멀티 맵, 키의 요소 목록을 저장하는 곳. 이 경우 사용할 수 있습니다.

my_dict.setdefault(key, []).append(item)

사전에 키 값이 존재하지 않으면 SetDefault 메소드가 SetDefault의 두 번째 매개 변수로 설정됩니다. 표준 my_dict [key]처럼 동작하여 키의 값 (새로 설정된 값일 수 있음)을 반환합니다.

Cgoldberg와 동의했습니다. 내가 어떻게 하는가 :

try:
    dict[key] += 1
except KeyError:
    dict[key] = 1

따라서 위와 같이 수행하거나 다른 사람들이 제안한대로 기본 덕트를 사용하십시오. 진술을 사용하지 마십시오. 그것은 피닉이 아닙니다.

많은 답변에서 볼 수 있듯이 몇 가지 해결책이 있습니다. LBYL의 한 가지 인스턴스 (도약하기 전에보세요)는 아직 언급되지 않았습니다. has_key () 메소드 :

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

이 문제를 해결하기 위해 최근에 내가 생각해 낸 하나의 라이너가 있습니다. 그것은 기반입니다 기본값으로 설정 사전 방법 :

my_dict = {}
my_dict[key] = my_dict.setdefault(key, 0) + 1

나는 그것을 찾고 있었고, 웹에서 그것을 찾지 못했고 시도/오류로 나의 행운을 시도하고 그것을 찾았습니다.

my_dict = {}

if my_dict.__contains__(some_key):
  my_dict[some_key] += 1
else:
  my_dict[some_key] = 1
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top