2009-11-13 10 views
44

मैं पायथन के लिए नया हूं, और otherlanguages में Multimaps के कार्यान्वयन से परिचित हूं। क्या पाइथन में ऐसी डेटा संरचना अंतर्निहित है, या आमतौर पर उपयोग की जाने वाली लाइब्रेरी में उपलब्ध है?क्या Python में '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 के बजाय आप set, जिस स्थिति में आप .append के बजाय .add फोन चाहते हैं का उपयोग कर सकते हैं।)


एक अलग रूप में के रूप में : इन दो पंक्तियों को आपने लिखा:

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

वर्तमान में पाइथन मानक libs में कोई बहु-मानचित्र नहीं है।

वेबओबी में MultiDict कक्षा है जो HTML फॉर्म मानों का प्रतिनिधित्व करने के लिए उपयोग की जाती है, और इसका उपयोग कुछ पायथन वेब ढांचे द्वारा किया जाता है, इसलिए कार्यान्वयन युद्ध परीक्षण किया जाता है।

वेर्कज़ुग में MultiDict वर्ग भी है, और इसी कारण से।

1

पायथन में इसे लिखने का मानक तरीका एक ऐसे नियम के साथ है जिसका तत्व प्रत्येक list या set है। stephan202 says के रूप में, आप इसे डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से स्वचालित कर सकते हैं, लेकिन आपको यह नहीं करना है।

दूसरे शब्दों में मैं

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

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

डाउनवॉट क्यों? क्योंकि यह एक ताना की तरह पर्याप्त नहीं दिखता है? मुझे लगता है कि 'ए [1] =' बी '' को बदलने के बजाए, 'ए [1]', सहायक से ज्यादा भ्रमित है। – poolie

+2

मैंने डाउनवोट नहीं किया, लेकिन मुझे लगता है कि आपका सुझाव चर्चा में कुछ भी नहीं जोड़ता है, जो नकारात्मक प्रतिक्रिया की व्याख्या कर सकता है। आप निश्चित रूप से मूल्यों की सूचियों के लिए कुंजियों का एक नियम उपयोग कर सकते हैं, लेकिन यह मैन्युअल कार्यान्वयन परेशान, दोहराव, और कुछ हद तक त्रुटि-प्रवण है। जावा के लिए [गुवा के मल्टीमैप] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ArrayListMultimap.html) जैसे मल्टीमैप, सूचियों के मानचित्र से अधिक कुछ नहीं है , लेकिन यह बिल्कुल सुविधाजनक है क्योंकि यह कार्यान्वयन को छुपाता है। आपका सुझाव सटीक है, लेकिन इसमें कोई सुविधा नहीं है। – dimo414

+3

जिस बिंदु को मैं बनाने की कोशिश कर रहा था, जो दूसरों द्वारा नहीं बनाया गया है, है: एक मल्टीमैप का उपयोग पायथनिक नहीं है। मूर्खतापूर्ण तरीका सेट का एक नियम है। – poolie

2

करने के लिए अपने कोड अनुवाद होगा Stephan202 सही जवाब है, defaultdict का उपयोग करें।लेकिन अगर आप सी ++ एसटीएल मल्टीमैप के इंटरफेस और भी बदतर प्रदर्शन के साथ कुछ चाहते हैं, आप ऐसा कर सकते हैं:

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

अब जब आप multimap के माध्यम से पुनरावृति, आप की तरह आप एक std::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

हालांकि यह एक निर्देश की तरह बिल्कुल व्यवहार नहीं करेगा। http://stackoverflow.com/questions/3387691/python-how-to-perfectly-override-a-dict – johncip

9
बस भावी आगंतुकों के लिए

। वर्तमान में मल्टीमैप का एक अजगर कार्यान्वयन है। यह pypi

+0

"इस प्रोजेक्ट बनाम दूसरों की परिभाषित गुणवत्ता यह है कि एक ही कुंजी द्वारा मैप किए गए मानों को एक साथ आदेश नहीं दिया जाता है।" 'डिफ़ॉल्ट डिक्ट (सेट) 'का उपयोग करने से यह अलग कैसे है? – Shuklaswag

संबंधित मुद्दे