dict

2015-07-17 10 views
5

में सूची को समर्पित करने का सबसे तेज़ तरीका मेरे पास सूचियां हैं और सूचियों को समर्पित करने के लिए तेज़ तरीका चाहिए।dict

मुझे पता है कि सेट() फ़ंक्शन का उपयोग करके अलगाव में एक सूची को कैसे घटाया जाए, लेकिन इस मामले में मैं प्रत्येक सूची को रास्ते में समर्पित करने के लिए एक तेज़ तरीका चाहता हूं।

hello = {'test1':[2,3,4,2,2,5,6], 'test2':[5,5,8,4,3,3,8,9]} 

मुझे यह दिखना पसंद है;

hello = {'test1':[2,3,4,5,6], 'test2':[5,8,4,3,9]} 

हालांकि मैं जरूरी सूचियों संरक्षित के मूल आदेश की आवश्यकता नहीं है।

मैं इस तरह एक सेट का उपयोग कर की कोशिश की है, लेकिन यह काफी सही नहीं है (यह ठीक से पुनरावृत्ति नहीं कर रहा है और मैं पहली बार कुंजी खो रहा हूँ)

for key, value in hello.items(): goodbye = {key: set(value)} 
>>> goodbye 
{'test2': set([8, 9, 3, 4, 5])} 

संपादित: नीचे PM 2Ring की टिप्पणी के बाद, मैं पहली जगह में डुप्लीकेट से बचने के लिए अलग-अलग निर्देशों को पॉप्युलेट कर रहा हूं। पहले मैं सूचियों का उपयोग कर रहा था, लेकिन सेट का उपयोग करके डिफ़ॉल्ट रूप से डुप्लिकेट को जोड़ा जा सकता है;

>>> my_numbers = {} 
>>> my_numbers['first'] = [1,2,2,2,6,5] 
>>> from collections import defaultdict 
>>> final_list = defaultdict(set) 
>>> for n in my_numbers['first']: final_list['test_first'].add(n) 
... 
>>> final_list['test_first'] 
set([1, 2, 5, 6]) 

आप देख सकते हैं, अंतिम आउटपुट एक deduped सेट, के रूप में आवश्यक है।

+2

आदेश संरक्षण में रुचि नहीं है, और यह भी मेरी सूची नहीं है एक निर्देश का हिस्सा। –

+2

यदि आपको आदेश को संरक्षित करने की आवश्यकता नहीं है, तो सेट-आधारित दृष्टिकोण के लिए जाएं: यह सूची-आधारित दृष्टिकोण से अधिक कुशल है, लेकिन यदि आपकी सूचियां छोटी हैं या यदि उनके पास कुछ डुप्ली हैं तो आपको अधिक गति अंतर दिखाई नहीं दे सकता है । और अपने निर्देशों के मूल्यों के रूप में सूचियों के बजाय सेट संग्रहित करने पर विचार करें। OTOH, _very_ छोटी सूचियों के लिए, सेट-आधारित तरीका _slower_ हो सकता है। इसके अलावा, सूचियों की तुलना में थोड़ा और स्मृति का उपयोग करता है। –

+0

@ पीएम 2 रिंग मैं अंत में सेट का उपयोग करने के साथ चला गया, इसलिए पहली जगह में डुप्लिकेट से बचा। सेट में जोड़ने के लिए डिफॉल्टडिक्ट (सेट) और .add (n) चाल है। क्यू अद्यतन –

उत्तर

4

यह गलत पुनरावृत्ति नहीं कर रहा है, तो आप सिर्फ अलविदा एक नया dict के रूप में हर बार बताए जा रहे हैं। आपको खाली खाली के रूप में असाइन करने की आवश्यकता है, फिर प्रत्येक पुनरावृत्ति में मानों को मानों को असाइन करें।

goodbye = {} 
for key, value in hello.items(): goodbye[key] = set(value) 
>>> goodbye 
{'test1': set([2, 3, 4, 5, 6]), 'test2': set([8, 9, 3, 4, 5])} 

इसके अलावा के बाद से सेट, क्रम बनाए रखने नहीं करता है, तो आप एक साधारण-बार दोहराना समारोह है कि एक नई सूची पहले से ही जोड़ा मूल्यों पर छोड़ देता है तो वापस आ जाएगी बनाने के लिए यह सबसे अच्छा है की रक्षा करना चाहते हैं करते हैं।

def uniqueList(li): 
    newList = [] 
    for x in li: 
     if x not in newList: 
      newList.append(x) 
    return newList 


goodbye = {} 
for key, value in hello.items(): goodbye[key] = uniqueList(value) 
>>> goodbye 
{'test1': [2, 3, 4, 5, 6], 'test2': [5, 8, 4, 3, 9]} 
+1

मुझे लगता है कि ओपी ने कहा कि उनका समाधान "बिल्कुल सही नहीं है", और ऑर्डर अपेक्षित आउटपुट में सूचियों (!) में संरक्षित है। –

+0

ओपी यहां। असल में, आदेश को संरक्षित करना कोई फर्क नहीं पड़ता। तो यह दृष्टिकोण मेरे उद्देश्यों के लिए भी ठीक काम करता है। मेरा समाधान बिल्कुल सही नहीं था क्योंकि मैं केवल एक कुंजी के साथ छोड़कर, जोड़ने के बजाय एक नया मूल्य असाइन कर रहा था। –

+0

पूर्णता के लिए वैसे भी, एक दूसरा आदेश संरक्षण समाधान जोड़ा गया। – SuperBiasedMan

5

आप एक deduplicate समारोह है कि आदेश को बरकरार रखता है के साथ एक सूची समझ का उपयोग कर सकते हैं:

def deduplicate(seq): 
    seen = set() 
    seen_add = seen.add 
    return [ x for x in seq if not (x in seen or seen_add(x))] 

{key: deduplicate(value) for key, value in hello.items()} 
+0

बस एक नोट के रूप में: dict समझें पुराने पायथन संस्करणों जैसे 2.7 की तरह काम नहीं करती हैं। – Daniel

+1

@Daniel यह Python 2.7 में काम करता है, यह उससे पुराने किसी भी संस्करण में काम नहीं करता है। –

+0

@AnandS कुमार आप सही हैं। मैंने इसे गड़बड़ कर दिया। – Daniel

0

यह बात करने का एक अधिक वर्बोज़ रास्ता है, जो आदेश को बरकरार रखता है और सभी अजगर संस्करणों में काम करता है:

for key in hello: 
    s = set() 
    l = [] 
    for subval in hello[key]: 
     if subval not in s: 
      l.append(subval) 
      s.add(subval) 
    hello[key] = l 
0
my_list = [1,2,2,2,3,4,5,6,7,7,7,7,7,8,9,10] 
seen = set() 
print list(filter(lambda x:x not in seen and not seen.add(x),my_list)) 
3
>>>hello = {'test1':[2,3,4,2,2,5,6], 'test2':[5,5,8,4,3,3,8,9]}  
>>>for key,value in hello.iteritems(): 
     hello[key] = list(set(value)) 
>>>hello 
{'test1': [2, 3, 4, 5, 6], 'test2': [8, 9, 3, 4, 5]} 
+1

आह ठंडा, जो 'सेट' को वापस सूची में बदल देता है। –