2009-11-13 2 views
44

저는 파이썬에 익숙하지 않아 Multimaps 구현에 익숙합니다. otherlanguages입니다. 파이썬에는 이러한 데이터 구조가 내장되어 있습니까? 아니면 일반적으로 사용되는 라이브러리에서 사용할 수 있습니까?파이썬에서 '멀티 맵'구현이 있습니까?

나는 "multimap은"무슨 뜻인지 설명하기 :

a = multidict() 
a[1] = 'a' 
a[1] = 'b' 
a[2] = 'c' 

print(a[1]) # prints: ['a', 'b'] 
print(a[2]) # prints: ['c'] 
+2

@ccfenix를 통해 사용할 수 있습니다. 원하는 것을 생각해 보았습니다. 이것이 틀린 경우, 예제를 수정하여 편집하십시오. 예를 들어 사람들이 귀하의 질문에 답변 할 수 있도록 도와줍니다. 그들은 당신이 찾고있는 것을 알아야합니다. – steveha

+0

야, 정확히 내가 원하는 것, 스티브 하 감사합니다! –

+0

http://code.activestate.com/recipes/576835-multimap-associating-multiple-values-to-a-key/ – Chozabu

답변

85

이러한 점은 표준 라이브러리에 존재하지 않습니다. 당신이 사용할 수있는 defaultdict하지만 :

>>> from collections import defaultdict 
>>> md = defaultdict(list) 
>>> md[1].append('a') 
>>> md[1].append('b') 
>>> md[2].append('c') 
>>> md[1] 
['a', 'b'] 
>>> md[2] 
['c'] 

(대신 list의 당신이 대신 .append.add를 호출 할 것이 경우 set을 사용할 수 있습니다.) 옆으로으로


을 : 당신이 쓴 두 줄을보세요 :

a[1] = 'a' 
a[1] = 'b' 

o 표현식 a[1]이 두 개의 별개 값과 같아야 함을 나타냅니다. 사전은 키가 고유하고 각 값이 단일 값과 연결되어 있기 때문에 사전에서는 불가능합니다. 그러나 일 수 있습니다. 그러나, 주어진 키와 연관된 목록 내의 모든 값을 하나씩 추출합니다. iter을 사용하고이어서 next을 연속적으로 호출 할 수 있습니다. 아니면 단지 두 개의 루프를 사용할 수 있습니다

>>> for k, v in md.items(): 
...  for w in v: 
...   print("md[%d] = '%s'" % (k, w)) 
... 
md[1] = 'a' 
md[1] = 'b' 
md[2] = 'c' 
-3

내가 명확하게 예를

a[1] = 'a' 
a[1] = 'b' #?? 

의 의미를 이해하지 못하는 것은에있는 요소를 교체하기로 두 번째 줄 a[1] = 'b' [1]. 예인 경우 사전을 사용해야합니다. 그렇지 않다면 사전 목록을 사용해야합니다 (이미 제안 된대로)

+4

다중지도가 무엇인지 읽어보십시오. http://www.cplusplus.com/reference/stl/multimap/ – Casebash

1

현재 파이썬 표준 라이브러리에는 다중 맵이 없습니다.

WebOb은 HTML 양식 값을 나타내는 데 사용되는 MultiDict 클래스이며 일부 Python 웹 프레임 워크에서 사용되므로 구현 테스트가 완료됩니다.

Werkzeug도 MultiDict 클래스를 가지고 있으며, 같은 이유로.

1

파이썬에서 이것을 작성하는 표준 방법은 요소가 각각 list 또는 set 인 dict를 사용하는 것입니다. stephan202 says으로 defaultdict로 다소 자동화 할 수 있지만 반드시 할 필요는 없습니다.

은 즉 내가 defaultdict를 사용 Stephan202가 정답을 가지고

a = dict() 
a[1] = ['a', 'b'] 
a[2] = ['c'] 

print(a[1]) # prints: ['a', 'b'] 
print(a[2]) # prints: ['c'] 
+0

왜 downvotes입니까? 그것은 dict처럼 보이지 않기 때문에? 나는'a [1] = 'b ''를'a [1]'을 대체하는 것이 아니라 도움이되는 것보다 더 혼란스러운 것으로 생각합니다. – poolie

+2

나는 downvote하지 않았지만 당신의 제안이 부정적인 반응을 설명하는 토론에 아무것도 추가하지 않는다고 생각합니다. 키 목록을 사용하여 값 목록에 확실히 사용할 수 있지만이 수동 구현은 귀찮고 반복적이며 다소 오류가 발생하기 쉽습니다. Java 용 [Guava의 멀티 맵] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ArrayListMultimap.html)과 같은 멀티 맵은 목록의지도 일뿐입니다. , 그 구현을 숨기기 때문에 엄청나게 편리합니다. 귀하의 제안은 정확하지만 편의성이 부족합니다. – dimo414

+3

다른 사람이 만들지 않은 부분은 다음과 같습니다. 다중 맵 사용은 Pythonic이 아닙니다. 관용구적인 방법은 세트를 사용하는 것입니다. – poolie

2

에 코드를 번역하는 것입니다.이제

multimap = [] 
multimap.append((3,'a')) 
multimap.append((2,'x')) 
multimap.append((3,'b')) 
multimap.sort() 

당신이 multimap을 반복 할 때, 당신은 당신이 std::multimap에서와 같은 쌍을 얻을 것이다 :하지만 당신은 C++ STL의 multimap에의 인터페이스 및 훨씬 더 성능이 뭔가를 원한다면, 당신은이 작업을 수행 할 수 있습니다. 불행히도, 그것은 당신의 루프 코드가 C++처럼보기 싫어지게된다는 것을 의미합니다. 요약

def multimap_iter(multimap,minkey,maxkey=None): 
    maxkey = minkey if (maxkey is None) else maxkey 
    for k,v in multimap: 
    if k<minkey: continue 
    if k>maxkey: break 
    yield k,v 

# this will print 'a','b' 
for k,v in multimap_iter(multimap,3,3): 
    print v 

defaultdict는 정말 멋진이며, 파이썬의 힘을 활용하고 당신이 그것을 사용해야합니다.

2

또는 서브 클래스 dict :

그냥 미래 방문자를위한
class Multimap(dict): 
    def __setitem__(self, key, value): 
     if key not in self: 
      dict.__setitem__(self, key, [value]) # call super method to avoid recursion 
     else 
      self[key].append(value) 
+1

이것은 dict과 똑같이 행동하지는 않습니다. http://stackoverflow.com/questions/3387691/python-how-to-perfectly-override-a-dict – johncip

9

. 현재 Multimap의 파이썬 구현이 있습니다. pypi

+0

"이 프로젝트와 다른 것의 품질을 정의하는 것은 동일한 키로 매핑 된 값이 함께 정렬되지 않는다는 것입니다." 이것은'defaultdict (set)'을 사용하는 것과 어떻게 다릅니 까? – Shuklaswag

관련 문제