पायथॉन तानाशाह कैसे कुंजी बनाने के लिए या कुंजी के लिए एक तत्व संलग्न?


161

मेरे पास एक खाली शब्दकोष है। नाम: dict_x इसमें उन कुंजियों का होना है, जिनमें मूल्य सूची हैं।

एक अलग पुनरावृत्ति से, मैं एक कुंजी (उदा:) प्राप्त करता हूं key_123, और एक आइटम (एक टुपल) को सूची के dict_xमूल्य की सूची में जगह देता हूं key_123

यदि यह कुंजी पहले से मौजूद है, तो मैं इस आइटम को जोड़ना चाहता हूं। यदि यह कुंजी मौजूद नहीं है, तो मैं इसे एक खाली सूची के साथ बनाना चाहता हूं और फिर इसे जोड़ देता हूं या बस इसमें एक ट्यूपल के साथ बनाता हूं।

भविष्य में जब फिर से यह कुंजी आती है, क्योंकि यह मौजूद है, मैं चाहता हूं कि मूल्य फिर से जोड़ा जाए।

मेरे कोड में ये शामिल हैं:

कुंजी और मूल्य प्राप्त करें।

देखें कि क्या कुंजी मौजूद नहीं है dict_x

और अगर नहीं बना तो: dict_x[key] == []

बाद में: dict_x[key].append(value)

क्या ऐसा करने का तरीका है? क्या मैं try/exceptब्लॉक का उपयोग करने की कोशिश करूंगा ?

जवाबों:


253

उपयोग करें dict.setdefault():

dic.setdefault(key,[]).append(value)

मदद (dict.setdefault) :

    setdefault(...)
        D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D

4
मैं ऐसा करता था, dict_x[key] = [some_value] if not dict_x.has_key(key) else dict_x[key] + [some_value]लेकिन यह जवाब कहीं बेहतर तरीका बताता है। वास्तव में यह set()एक तर्क के रूप में मिलता है और आपको add()विधि का उपयोग करने की अनुमति देता है ...
fatih_dur

66

यहां ऐसा करने के विभिन्न तरीके हैं ताकि आप तुलना कर सकें कि यह कैसा दिखता है और आपको क्या पसंद है। मैंने उन्हें इस तरह से आदेश दिया है कि मुझे लगता है कि सबसे "पायथोनिक" है , और उन पेशेवरों और विपक्षों पर टिप्पणी की जो पहली नज़र में स्पष्ट नहीं हो सकते हैं:

का उपयोग कर collections.defaultdict:

import collections
dict_x = collections.defaultdict(list)

...

dict_x[key].append(value)

पेशेवरों: शायद सबसे अच्छा प्रदर्शन। विपक्ष: पायथन 2.4.x में उपलब्ध नहीं है।

का उपयोग कर dict().setdefault():

dict_x = {}

...

dict_x.setdefault(key, []).append(value)

विपक्ष: अप्रयुक्त के अक्षम निर्माण list()एस।

का उपयोग कर try ... except:

dict_x = {}

...

try:
    values = dict_x[key]
except KeyError:
    values = dict_x[key] = []
values.append(value)

या:

try:
    dict_x[key].append(value)
except KeyError:
    dict_x[key] = [value]

हैलो, आपको क्यों लगता है कि .setdefault अनावश्यक शब्दकोश बनाता है?
फिल

2
मुझे नहीं लगता कि .setdefault()अनावश्यक शब्दकोश बनाता है। मुझे लगता है कि मैं दूसरे तर्क में अनावश्यक lists (यानी []) बना रहा हूं,.setdefault() यदि keyपहले से मौजूद है तो इसका कभी उपयोग नहीं किया जाता है। मैं dict.setdefault()(कुशल कुंजी हैशिंग के लाभ के लिए) का उपयोग कर सकता हूं , और अप्रयुक्त listएस के पुन: उपयोग के लिए एक चर का उपयोग कर सकता हूं , लेकिन यह कोड की कुछ और पंक्तियों को जोड़ता है।
एंटक

1
IIRC, पायथन में एक बराबरी में एक खाली सूची को बायटेकोड स्तर पर एक स्थिर माना जाता है, लेकिन इसके लिए बायटेकोड गुरु द्वारा कुछ पुष्टि की आवश्यकता होती है (या बस डिस मॉड्यूल का उपयोग करें)।
जाबोर

का उपयोग करते हुए .setdefaultएक नियमित रूप से बनाता है dictजहां अनुपस्थित कुंजी लुक-अप एक में परिणाम होगा KeyError, जबकि collections.defaultdict(list)बनाता है एक dictजहां अनुपस्थित कुंजी लुकअप एक खाली डाल देगा listमुझे लगता है कि आप जो व्यवहार आप चाहते हैं के आधार पर चयन करना चाहिए -
Chris_Rands

मैंने अपने स्वयं के कोड में collection.defaultdict के समान कुछ की कोशिश की और इसके अप्रत्याशित दुष्प्रभाव थे। उदाहरण के लिए निम्नलिखित IDLE विनिमय पर विचार करें: >>> list_dict = defaultdict (सूची) >>> len (list_dict) 0 >>> len (list_dict [0]) 0 >>> len (list_dict) 1 ऐसा प्रतीत होता है कि जब पायथन आक्रमण करता है डिफ़ॉल्ट मान यह आपके द्वारा सक्रिय रूप से सेट किए बिना शब्दकोश में कुंजी जोड़ता है, जो कि डिफ़ॉल्ट का उपयोग किए जाने पर बहुत सारी खाली सूची बनाने जा रहा है। मैं शब्दकोश के लिए अपने स्वयं के आवरण कार्यों को रोल करने जा रहा हूं, अक्षम लेकिन उम्मीद के मुताबिक अधिक पूर्वानुमान।
RDBury

26

आप इसके लिए एक डिफॉल्ट का उपयोग कर सकते हैं ।

from collections import defaultdict
d = defaultdict(list)
d['key'].append('mykey')

यह थोड़ा और अधिक कुशल है setdefaultक्योंकि आप नई सूचियों का निर्माण नहीं करते हैं जिनका आप उपयोग नहीं करते हैं। हर कॉल setdefaultएक नई सूची बनाने जा रही है, भले ही वह आइटम पहले से ही शब्दकोश में मौजूद हो।


14

आप डिफॉल्ट डिसाइड का उपयोग कर सकते हैं collections

डॉक्टर से एक उदाहरण:

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
    d[k].append(v)

0
dictionary['key'] = dictionary.get('key', []) + list_to_append

1
आपको कुछ अपवादों की उपस्थिति में (बहुत मामूली) लाभ की व्याख्या करनी चाहिए; केवल कोड के रूप में, यह स्पष्ट नहीं है कि अतिरिक्त उत्तर की आवश्यकता क्यों है।
डेविस हेरिंग

नमस्ते, अतिरिक्त आयात के बिना बस एक विकल्प। यह स्पष्ट रूप से एक if स्टेटमेंट के साथ किया जा सकता है। मैं केवल .get () का उपयोग करने के बजाय ([) की शक्ति का उपयोग करके एक विकल्प सुझा रहा हूं।
टॉमस सिल्वा एबेन्सपर्गर

शीर्ष दो उत्तरों में बिना किसी आयात के दो अलग-अलग तरीकों का उल्लेख है (यद्यपि नहीं dict.get)।
डेविस हेरिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.