2013-01-24 27 views
289

क्या पाइथन (कुंजी के लिए) में एक शब्दकोश समझना संभव है?पायथन शब्दकोश समझ

l = [] 
for n in range(1, 11): 
    l.append(n) 

हम एक सूची समझ को यह छोटा कर सकते हैं: l = [n for n in range(1, 11)]

सूची comprehensions के बिना, आप कुछ इस तरह उपयोग कर सकते हैं।

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

d = {} 
for n in range(1, 11): 
    d[n] = True # same value for each 

मैं इस की कोशिश की है:

d = {} 
d[i for i in range(1, 11)] = True 

हालांकि, मैं for पर एक SyntaxError मिलता है।

इसके अलावा (मैं इस हिस्से की जरूरत नहीं है, लेकिन बस सोच), तो आप इस तरह, विभिन्न मूल्यों का एक समूह के लिए एक शब्दकोश की कुंजी सेट कर सकते हैं:

d = {} 
for n in range(1, 11): 
    d[n] = n 

एक शब्दकोश समझ के साथ इस संभव है ?

d = {} 
d[i for i in range(1, 11)] = [x for x in range(1, 11)] 

यह भी for पर एक SyntaxError को जन्म देती है।

+1

भावी पाठकों की जानकारी के लिए: NumPy arrays आपको कई तत्वों को एक मान या मूल्यों की सूची में सेट करने देता है, जिस तरह से आप करने का प्रयास कर रहे हैं। यद्यपि यदि आपके पास पहले से ही NumPy का उपयोग करने का कोई कारण नहीं है, तो शायद इस सुविधा के लिए यह संभव नहीं है। –

उत्तर

390

dictionary comprehensions in Python 2.7+ हैं, लेकिन वे जिस तरह से प्रयास कर रहे हैं, वे काम नहीं करते हैं। एक सूची समझ की तरह, वे नया शब्दकोश बनाते हैं; आप मौजूदा शब्दकोष में कुंजी जोड़ने के लिए उनका उपयोग नहीं कर सकते हैं। साथ ही, आपको चाबियाँ और मान निर्दिष्ट करना होगा, हालांकि निश्चित रूप से आप एक डमी मान निर्दिष्ट कर सकते हैं।

>>> d = {n: n**2 for n in range(5)} 
>>> print d 
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16} 

आप उन सब को सही पर सेट करना चाहते हैं:

>>> d = {n: True for n in range(5)} 
>>> print d 
{0: True, 1: True, 2: True, 3: True, 4: True} 

क्या आप के लिए पूछ रहा हो रहे हैं एक मौजूदा शब्दकोश पर एक साथ कई चाबियाँ स्थापित करने के लिए एक तरीका है। इसके लिए कोई सीधा शॉर्टकट नहीं है। आप या तो लूप कर सकते हैं जैसा कि आपने पहले ही दिखाया है, या आप नए मानों के साथ एक नया नियम बनाने के लिए एक शब्दकोश समझ का उपयोग कर सकते हैं, और फिर पुराने मानों में नए मानों को मर्ज करने के लिए oldDict.update(newDict) करें।

+10

FWIW, 'dict.update'' dict' कंस्ट्रक्टर – mgilson

+1

की तरह कुंजी-मूल्य जोड़े के एक पुनरावर्तनीय को भी स्वीकार कर सकता है ध्यान दें कि यदि आप सभी मानों के साथ एक शब्दकोश बनाना चाहते हैं, तो 'dict.fromkeys()' का उपयोग करें। तो सभी मानों को 'सही' पर सेट करने के लिए, 'dict.fromkeys (रेंज (5), True) का उपयोग करें। देखें, मान * कॉपी नहीं किया गया है *, इसलिए जब आप एक परिवर्तनीय मूल्य प्राप्त कर सकते हैं तो आप इससे बच सकते हैं; यह सभी चाबियों के बीच साझा किया जाएगा। –

+1

नोट: कुंजी एक विधि का परिणाम भी हो सकती है: '{n * 2: n श्रेणी में एन (3)} => {0: 0, 2: 1, 4: 2}'। दोनों एक ही अभिव्यक्ति में किए जा सकते हैं: '{n * 2: n * 3 श्रेणी में एन (3)} => {0: 0, 2: 3, 4: 6}'। – Zaaier

136

आप dict.fromkeys वर्ग विधि का उपयोग कर सकते हैं ...

>>> dict.fromkeys(range(1, 11), True) 
{1: True, 2: True, 3: True, 4: True, 5: True, 6: True, 7: True, 8: True, 9: True, 10: True} 

यह एक शब्दकोश है, जहां सभी चाबियाँ एक ही मूल्य के लिए नक्शे बनाने के लिए सबसे तेज़ तरीका है।

हालांकि अस्थायी वस्तुओं के साथ इस का उपयोग करते हुए सावधान रहें:

d = dict.fromkeys(range(10), []) 
d[1].append(2) 
print(d[2]) # ??? 

आप वास्तव में नहीं जरूरत सभी कुंजियों प्रारंभ करने में, एक defaultdict रूप में अच्छी तरह उपयोगी हो सकता है करते हैं:

from collections import defaultdict 
d = defaultdict(lambda: True) 

दूसरे भाग का जवाब देने के लिए, एक स्पोक-समझ केवल वही है जो आपको चाहिए:

{k: k for k in range(10)} 

या python2.6 के लिए:

dict((k, k) for k in range(10)) 

अगर आपको __missing__ ओवरराइड जो एक defaultdict की तरह कुछ हद तक काम करता है dict की एक चतुर उपवर्ग बना सकते हैं:

>>> class KeyDict(dict): 
... def __missing__(self, key): 
...  #self[key] = key # Maybe add this also??? 
...  return key 
... 
>>> d = KeyDict() 
>>> d[1] 
1 
>>> d[2] 
2 
>>> d[3] 
3 
>>> print(d) 
{} 

साफ।

+0

ध्यान दें कि 'd = defaultdict (lambda: True) 'के मामले में, lambda की आवश्यकता नहीं है क्योंकि सत्य (या नहीं होना चाहिए) उत्परिवर्तनीय है। – rhbvkleef

21
>>> {i:i for i in range(1, 11)} 
{1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10} 
10

उपयोग dict() tuples की एक सूची पर, इस समाधान आप प्रत्येक सूची में मनमाने ढंग से मूल्यों के लिए,

i_s = range(1, 11) 
x_s = range(1, 11) 
# x_s = range(11, 1, -1) # Also works 
d = dict([(i_s[index], x_s[index],) for index in range(len(i_s))]) 
+10

एक साइड नोट के रूप में, यह वही बात है जैसे 'd = dict (ज़िप (i_s, x_s))' – mgilson

-2

आप हैश नहीं कर सकते हैं की अनुमति देगा जब तक कि वे एक ही लंबाई हैं उस तरह की एक सूची। ऐसा करें, यह tuples

d[tuple([i for i in range(1,11)])] = True 
+6

यह ओपी चाहता था जो कुछ भी नहीं करता ... –

6

एक सूची समझ का मुख्य उद्देश्य बदलते या मूल सूची को नष्ट किए बिना एक दूसरे के आधार पर एक नई सूची बनाने के लिए है का उपयोग करता है।

इसके बजाय लेखन के

l = [] 
    for n in range(1, 11): 
     l.append(n) 

या

l = [n for n in range(1, 11)] 

आप केवल

l = range(1, 11) 

दो शीर्ष कोड ब्लॉक आप एक नई सूची बना रहे हैं में लिखना चाहिए, इसके माध्यम से पुनरावृत्ति और बस प्रत्येक तत्व लौट रहा है। यह एक सूची प्रति बनाने का एक महंगा तरीका है।

सभी कुंजियों एक और dict के आधार पर एक ही मान पर सेट के साथ एक नया शब्दकोश पाने के लिए, ऐसा करते हैं:

old_dict = {'a': 1, 'c': 3, 'b': 2} 
    new_dict = { key:'your value here' for key in old_dict.keys()} 

आप एक सिंटैक्स त्रुटि प्राप्त हो रही है, क्योंकि जब आप

d = {} 
    d[i for i in range(1, 11)] = True 

तुम लिखो मूल रूप से कह रहा है: "मैं अपनी कुंजी सेट करता हूं" मैं रेंज में (1, 11) 'ट्रू "में हूं और" मैं रेंज में (1, 11) "एक वैध कुंजी नहीं है, यह सिर्फ एक वाक्यविन्यास त्रुटि है। यदि dicts कुंजी के रूप में समर्थित सूचियों, आप की तरह

d[[i for i in range(1, 11)]] = True 

और नहीं

d[i for i in range(1, 11)] = True 

कुछ करना होगा, लेकिन सूचियों ताकि आप उन्हें dict कुंजी के रूप में उपयोग नहीं कर सकते, hashable नहीं हैं।

16

मुझे वास्तव में @mgilson टिप्पणी पसंद है, क्योंकि यदि आपके पास दो पुनरावृत्तियों हैं, जो कुंजी और अन्य मानों से मेल खाते हैं, तो आप निम्न कार्य भी कर सकते हैं।

keys = ['a', 'b', 'c'] 
values = [1, 2, 3] 
d = dict(zip(keys, values)) 

देने

घ = { 'एक': 1, 'बी': 2, 'सी': 3}

9

शब्द की घटना की गिनती के इस उदाहरण पर विचार किसी सूची में शब्दकोश समझ

my_list = ['hello', 'hi', 'hello', 'today', 'morning', 'again', 'hello'] 
my_dict = {k:my_list.count(k) for k in my_list} 
print(my_dict) 

का उपयोग कर और परिणाम

है
{'again': 1, 'hi': 1, 'hello': 3, 'today': 1, 'morning': 1} 
+0

यह दिलचस्प है, हालांकि सबसे कुशल नहीं है क्योंकि आप कई बार 'हैलो' जैसी चाबियाँ गिनेंगे – FuriousGeorge