पायथन में एक सूची और खाली मान से कुंजियों के साथ एक तानाशाही को कैसे शुरू किया जाए?


251

मैं इससे प्राप्त करना चाहता हूं:

keys = [1,2,3]

इसके लिए:

{1: None, 2: None, 3: None}

क्या इसे करने का एक पैथोनिक तरीका है?

यह करने के लिए एक बदसूरत तरीका है:

>>> keys = [1,2,3]
>>> dict([(1,2)])
{1: 2}
>>> dict(zip(keys, [None]*len(keys)))
{1: None, 2: None, 3: None}

जवाबों:


390

dict.fromkeys([1, 2, 3, 4])

यह वास्तव में एक क्लासमेथोड है, इसलिए यह तानाशाही-उपवर्ग (जैसे collections.defaultdict) के लिए भी काम करता है । वैकल्पिक दूसरा तर्क मानों के लिए उपयोग करने के लिए मान निर्दिष्ट करता है (के लिए चूक None)


154
कुछ उत्परिवर्तित करने के लिए प्रारंभिक सावधान रहें: यदि आप कहते हैं, उदाहरण के लिए dict.fromkeys([1, 2, 3], []), सभी कुंजियों को एक ही सूची में मैप किया जाता है, और एक को संशोधित करके उन सभी को संशोधित किया जाएगा।
charleslparker

8
के साथ प्रारंभ करना {k:[] for k in [1, 2, 3]}हालांकि अभी भी सुरक्षित है।
अजीज अल्टो

263

किसी ने भी एक ताना-बाना समाधान देने की परवाह नहीं की?

>>> keys = [1,2,3,5,6,7]
>>> {key: None for key in keys}
{1: None, 2: None, 3: None, 5: None, 6: None, 7: None}

32
मेरा मानना है कि यह 2.7 बैकपोर्टेड किया गया था
विम

21
यह अच्छा है और स्वीकार किए गए उत्तर से संबंधित संदर्भ समस्या से ग्रस्त नहीं है।
charleslparker

यह आपको एक डिफ़ॉल्ट मान (जैसे False) प्रदान करने की अनुमति देता है ।
neverendingqs

यह पायथन 3 आईएमओ में सबसे साफ, सबसे पाइथोनिक तरीका है
बेड कॉन्स्टेंटिनाइड्स

4
एक तानाशाह-का उपयोग करना भी मान को एक फ़ंक्शन को कॉल करने का परिणाम देता है (जिसे एक तर्क के रूप में कुंजी पारित किया जा सकता है, यदि वांछित है) - तो यह एक बहुत शक्तिशाली तंत्र है।
मार्टीन्यू

56
dict.fromkeys(keys, None)

2
भयानक, मैं खाली सूची चाहता था,dict.fromkeys(keys, [])
म्यूऑन

12
@muon यह लगभग निश्चित रूप से नहीं है कि आप क्या चाहते हैं, charleslparker टिप्पणी देखें ।
गेरिट

पायथन संस्करण 2.6.6 में काम करता है।
माइक फिंच

2
खबरदार: यह सभी कुंजी बिंदुओं के साथ एक ही मूल्य के साथ तानाशाही को आरंभ करेगा
मेंडी बरेल

16
>>> keyDict = {"a","b","c","d"}

>>> dict([(key, []) for key in keyDict])

आउटपुट:

{'a': [], 'c': [], 'b': [], 'd': []}

1
इस कोड को इस सवाल का जवाब कर सकते हैं, के बारे में अतिरिक्त संदर्भ प्रदान करने के लिए कैसे और / या क्यों यह हल करती है समस्या जवाब की दीर्घकालिक मूल्य में सुधार होगा।
फ्रांसेस्को मेंजानी

4
नाम keyDictभ्रामक है, क्योंकि कोड की पहली पंक्ति एक रिटर्न देती है set, ए नहीं dict
ब्रायन ओकले

10
d = {}
for i in keys:
    d[i] = None

1
क्यों अजगर की तरह एक त्रुटि बाहर फेंक करता है: TypeError: 'type' object is not iterable?
फ़ॉफ़ी

1
@FrancescoCastellani क्योंकि listएक प्रकार है। जब तक आपके पास कुछ ऐसा नहीं है list = [], उपरोक्त विधि आपको हमेशा एक ही त्रुटि
देगी

1

में कई workflows जहां मनमाने ढंग से कुंजी के लिए एक डिफ़ॉल्ट / प्रारंभिक मूल्य अनुलग्न करना चाहते हैं, तो आप नहीं है जरूरत है हैश करने के लिए प्रत्येक कुंजी को व्यक्तिगत रूप से समय से आगे। आप उपयोग कर सकते हैं collections.defaultdict। उदाहरण के लिए:

from collections import defaultdict

d = defaultdict(lambda: None)

print(d[1])  # None
print(d[2])  # None
print(d[3])  # None

यह अधिक कुशल है, यह तात्कालिकता में आपके सभी कुंजी हैश करने के लिए बचाता है। इसके अलावा, defaultdictएक उपवर्ग है dict, इसलिए आमतौर पर वापस एक नियमित शब्दकोश में बदलने की कोई आवश्यकता नहीं है।

वर्कफ़्लोज़ के लिए जहां आपको अनुमेय कुंजी पर नियंत्रण की आवश्यकता होती है , आप dict.fromkeysस्वीकृत उत्तर के अनुसार उपयोग कर सकते हैं :

d = dict.fromkeys([1, 2, 3, 4])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.