2011-12-29 4 views
1

,파이썬 사전 또는 예를 들어 대체

if dict['sample']: 
    //append values to dict['sample'] 
else: 
    // assign new key to the python dictionary 

DICT [ '샘플'] 비어있는 경우, 파이썬은 오류가 발생합니다. 누구든지 이걸 확인하는 더 좋은 방법을 알고 있습니까?

내가 원하는 것은 데이터 목록을 갖게됩니다. a, a, b, c, g, g, g, g, g를 가정 해 봅시다.

그래서 파이썬 사전에 dict [ 'a']와 g, g, g, g, g의 값을 dict [ 'g']에 추가하고 나머지는 dict [ 'b'] 등. for 루프는 a, a, b, c, g, g, g, g, g의 데이터를 순환하도록 실행됩니다.

나는 내 질문을 분명히하기를 바랍니다. 어떤 생각? 파이썬의 사전에 기존 키를 확인하는 방법이 있다면 바람직합니다.

편집

신용 @ 폴 맥과이어로 이동합니다. 나는 Paul McGuire의 답을 토대로 내가 원했던 정확한 해결책을 알아 냈다. 아래와 같이 :

from collections import defaultdict 

class Test: 
    def __init__(self, a,b): 
     self.a=a 
     self.b=b 

data = [] 
data.append(Test(a=4,b=6)) 
data.append(Test(a=1,b=2)) 
data.append(Test(a=1,b=3)) 
data.append(Test(a=2,b=2)) 
data.append(Test(a=3,b=2)) 
data.append(Test(a=4,b=5)) 
data.append(Test(a=4,b=2)) 
data.append(Test(a=1,b=2)) 
data.append(Test(a=5,b=9)) 
data.append(Test(a=4,b=7)) 

dd = defaultdict(list) 
for c in data: 
    dd[c.a].append(c.b) 
print dd 
+0

또 다른 학습 기회 - * namedtuple *. 'Test = namedtuple ("Test", "ab")','namedtuple'을 콜렉션 모듈에서 가져 오기에 추가하고 나머지는 모두 남겨 둡니다 ('object', BTW를 확장해야합니다) . 'namedtuples'는이 간단한 struct-like 클래스들에 편리합니다. 게다가 그들은 불변하여 적절한 dict 키와 값을 설정할 수 있습니다. – PaulMcG

+0

지식에 다시 한번 감사드립니다. 위는 내가 작성한 예일뿐입니다. 서버 측에서 데이터를 가져와 GQL Query 객체를 반환해야했습니다. 그러나 귀하의 제안은 미래의 필요에 확실히 도움이됩니다. 다시 한 번 감사드립니다! :) – MrCooL

답변

13

"if key in key"또는 "dict.get"또는 "dict"의 오래된 접근 방식.을 setDefault "모두가 지금은 표준 defaultdict에 찬성 따로 설정해야합니다

data = "aabcggggg" 

from collections import defaultdict 
dd = defaultdict(list) 
for c in data: 
    dd[c].append(c) 
print dd 

defaultdict는 모든 코드는 1) 공장 함수 또는 클래스를 정의됩니다 관련이있다, 당신의 키가 있는지 확인을 담당 새 키 항목 (이 경우 defaultdict(list))을 초기화하는 데 사용하는 defaultdict 및 2) 각 키 (dd[c].append(c))로 수행 할 작업을 정의하십시오. 글자 그룹이 각 그룹화 값에 대해 연속적이기 때문에 실제로 itertools.groupby을 사용하십시오. groupby은 튜플의 반복자를 반환합니다. 각 튜플 conta 현재의 키의 값과 일치하는 값의 반복자를 삽입합니다. 다음 코드는 각 튜플의 list-values-iterator를 실제 목록 (list(v))으로 변환하고 key-valuelist 튜플 시퀀스를 dict 생성자에 전달하여 작동합니다.

from itertools import groupby 
print dict((k,list(v)) for k,v in groupby(data)) 

인쇄 :

{'a': ['a', 'a'], 'c': ['c'], 'b': ['b'], 'g': ['g', 'g', 'g', 'g', 'g']} 
+0

고맙습니다 @Paul McGuire, 내가 쓰려고하는 코드에 대해 자세히 설명하지 않았습니다. 나는 그것을 위의 나의 질문으로 요약했다. 나는 실제로 알파벳 대신 객체를 통해 반복 할 것입니다. 그래도 대답은 많은 사람들에게 추가 지식을 제공합니다. 매우 감사합니다! 고마워요! ;) – MrCooL

+0

BTW @Paul McGuire, 나는 당신과 'dict in key'사이의 중요한 차이를 궁금해합니다. 내 상황에서는 동일한 키가 감지되면 다른 작업을 수행해야합니다. 이것이 성능 향상에 영향을 주면 대신 답변을 수락하고 싶습니다. 그러나, 나는 그것이 내 사건을 해결하는지 궁금해. 내 질문을 편집했습니다. – MrCooL

+0

안녕하세요 @ 폴 McGuire, 내가 해결하려고하는 문제에 가장 적합한 귀하의 예를 기반으로 최신 솔루션을 게시했습니다 귀하의 답변을 수락했습니다. 내 질문에 정확한 해결책을 게시했습니다. :) 하지만 여전히, 당신이 당신의 첫 문장에서 강조한 것처럼 당신과 다른 사람들 사이의 약간의 중요한 차이점을 설명하기를 희망합니다. "dict in key"또는 "dict.get"또는 "dict. setdefault "는 현재 표준 defaultdict ' – MrCooL

2

모든 dict 키에는 목록이 있어야합니다. 내가 맞습니까?

d = dict() 
try: 
    d['sample'].append(new_data) 
except KeyError: 
    d['sample'] = [new_data] 

나는 이것이 효과가있을 것이라고 믿습니다. 그런데, 당신은 dictonary에 dict이라는 이름을 사용하면 안됩니다. dict는 이미 함수로 사용됩니다.

편집 1 :

나는 당신이하려는 것을 잘 모르겠다. 내 솔루션이 제안 된 것 중 최고인지 여부도 알 수 없습니다. 그러나 이것이 당신이하려고하는 것입니까? 좀 이상하게 보입니까? 아니면 모든 편지가 몇 번이나 나오는지 계산하고 싶습니까? '을 setDefault'방법의

# Create a list named l. 
l = ['a', 'a', 'b', 'c', 'g', 'g', 'g', 'g','g'] 

# Create dictionary named d. 
d = dict() 

for i in l: 
    try: 
     d[i].append(i) 
    except KeyError: 
     d[i] = [i] 
+0

신경 쓰지 마라. 나는 내가 당신의 질문을 이해하지 못한 것 같아요. –

+0

그것은 직접적으로 내 문제를 해결하지는 못했지만 @Niclas Nilsson을 돕습니다.하지만 KeyError :를 제외하고는 해결책을 찾아 내는데 도움이되었습니다. 나는 이것을 분명히 간과했다. 고마워요! – MrCooL

5
my_dict = {} 
my_dict.setdefault('sample', []).append(value) 

초 매개 변수는 나는 당신의 값이 목록입니다 이해한다면 지정된 키가

4

존재하지 않는 경우 초기 값을해야 무엇을 말한다.

if 'sample' in mydict: 
    pass #whatever 
else: 
    mydict['sample'] = [] 

싶은 것은 다음

A = ['a','a','b','b','b','c','c','c'] 

myDict = {} 
for i in A: 
    if i not in myDict: 
     myDict[i] = [] 
    myDict[i].append(i) 
print myDict 
+0

이것도 작동합니다. 내가 원했던 가장 간단한 해결책이라고 생각하는 것에 대한 내 대답을 게시했습니다. 그러나, 그것은 당신의 방식대로 잘 작동하므로 당신에게 크레딧을주기로 결정했습니다. 감사 ! – MrCooL

+0

나는 사람들이 내 대답에 투표 한 이유를 이해한다 : 나의 새 코드조차도 간단한 코드를 읽음으로써 어떤 일이 벌어지고 있는지를 이해한다. 그러나이 질문에 대한 다른 대답을 읽는 동안 나는 defaultdict에 대해 배웠습니다! 실제로, 내가 이해한다면, 그것은 멤버 함수를 오버로드하여 (기본값을 제외하고) try (항목을 가져 오기) 항목을 가져 오는 사전의 하위 클래스처럼 동작합니다. 사전을 사전 목록으로 만 사용하는 경우 (이것은 프로그램 전체에서 원하는 동작입니다) 내 솔루션은 의미가 없습니다 (많은 코드 복사 붙여 넣기가 필요하기 때문에) 솔루션은 기본값입니다! – jimifiki

+0

나는 "if in"문장이 방금 습관처럼 예외를 사용하여 더 아름답게 읽는다고 믿습니다. 그냥 말하고 싶었어 :) –

0

일부 아주 오래된 파이썬 사용하는 경우

if not myDict.has_key(key): 
    myDict[key]=[val] 
else: 
    myDict[key].append(val) 

최근 것은 has_key이 key in dict 에 찬성 사용되지 않습니다를 그래서 요즘은 :

if not key in myDict: 
    myDict[key]=[val] 
else: 
    myDict[key].append(val) 
+0

이 관행을 영속시키지 마십시오! has_key는 여러 버전 이전에 "if key in myDict :"에 찬성하여 사용 중단되었습니다. 최근 – PaulMcG

+0

? 아마도 파이썬 2.1이나 그 이전 버전을 사용하는 사람들이 너무 많지 않다. –

+0

동의했다. 그러나 나의 변호에서 OP는 어떤 버전의 파이썬도 언급하지 않았다. –

0

신용해야 @Niclas 닐슨가는 그의 게시 된 솔루션은 정말 내가 원하는 것을 위해 일하지 않았다하더라도, 그러나, 그것은 나를 솔루션을 알아내는 데 도움 않았다 I 가장 간단한 형태로 원했다.

여기에 모두의 도움을 주셔서 감사합니다. 추가 지식과 해결 방법이 있습니다. 고마워.

내가 추가 라이브러리 수입 등없이 간단한 방법으로 원하는 것을 달성 태그 :

r = {} 

try: 
    if r['new_data']: 
     r['new_data'] = 'appending' 
except KeyError: 
    r['new_data'] = 'new value' 

print r['new_data'] 
+0

다행이 당신을 위해 ... –

+0

정말 고마워. 좋은 직장을 계속!;) – MrCooL

0

정확한 솔루션은 내가 가장 아래 그림과 같이 원했다. 크레딧은 @Paul McGuire에게갑니다.

from collections import defaultdict 

class Test: 
    def __init__(self, a,b): 
     self.a=a 
     self.b=b 

data = [] 
data.append(Test(a=4,b=6)) 
data.append(Test(a=1,b=2)) 
data.append(Test(a=1,b=3)) 
data.append(Test(a=2,b=2)) 
data.append(Test(a=3,b=2)) 
data.append(Test(a=4,b=5)) 
data.append(Test(a=4,b=2)) 
data.append(Test(a=1,b=2)) 
data.append(Test(a=5,b=9)) 
data.append(Test(a=4,b=7)) 

dd = defaultdict(list) 
for c in data: 
    dd[c.a].append(c.b) 
print dd