2010-12-30 15 views
37

यह बहुत आसान है लेकिन मुझे इसे करने का एक सुंदर, पाइथोनिक तरीका पसंद है। असल में, एक शब्दकोश दिया जाता है, subdictionary लौटाता है जिसमें केवल उन चाबियाँ होती हैं जो एक निश्चित स्ट्रिंग से शुरू होती हैं।एक निश्चित स्ट्रिंग के साथ शुरू होने वाली कुंजियों द्वारा एक शब्दकोश को स्लाइड करना

» d = {'Apple': 1, 'Banana': 9, 'Carrot': 6, 'Baboon': 3, 'Duck': 8, 'Baby': 2} 
» print slice(d, 'Ba') 
{'Banana': 9, 'Baby': 2, 'Baboon': 3} 

यह एक समारोह के साथ क्या करना काफी सरल है:

def slice(sourcedict, string): 
    newdict = {} 
    for key in sourcedict.keys(): 
     if key.startswith(string): 
      newdict[key] = sourcedict[key] 
    return newdict 

लेकिन निश्चित रूप से वहाँ एक अच्छे, चालाक, अधिक पठनीय समाधान है? क्या जनरेटर यहां मदद कर सकता है? (मेरे पास उन लोगों का उपयोग करने के लिए पर्याप्त अवसर नहीं हैं)।

+0

नहीं अस्पष्ट अजगर कोड सिर्फ इसलिए कि यह संभव है। पाइथन का पूरा विचार पठनीयता है। अगर आपको अस्पष्ट शक्ति की आवश्यकता है, तो पर्ल का उपयोग करें। – user3181121

+0

यह भी देखें http://pythoncentral.io/how-to-slice-custom-objects-classes-in-python/, आप अपने स्वयं के प्रकार/उप-वर्ग में '__getitem__' को कस्टमाइज़ कर सकते हैं। – bjd2385

उत्तर

68

कैसे इस बारे में:

अजगर 2.x में:

def slicedict(d, s): 
    return {k:v for k,v in d.iteritems() if k.startswith(s)} 

अजगर 3.x में:

def slicedict(d, s): 
    return {k:v for k,v in d.items() if k.startswith(s)} 
+3

'स्लाइस' अंतर्निर्मित छाया को छाया न करें (भले ही लगभग कोई भी इसका उपयोग न करे)। –

+0

वह धक्का समझ स्वादिष्ट है। और मुझे नहीं पता था कि 'स्लाइस' एक बिल्टिन था, wtf? – Aphex

+3

@Ignacio: जब आप एक छोटे से, स्थानीय समारोह में होते हैं, तो वास्तव में यह हमेशा निर्मित नामों पर कदम उठाने के बारे में चिंतित नहीं होता है - उनमें से बहुत सारे नाम बहुत आम हैं। नॉनट्रिविअल फ़ंक्शंस (यदि वह) और ग्लोबल्स के लिए इसके बारे में चिंता करने के लिए बेहतर है। बिल्टिन कीवर्ड नहीं हैं, आखिरकार। –

9

कार्यात्मक शैली में:

dict(filter(lambda item: item[0].startswith(string),sourcedict.iteritems()))

+8

पायथन में, कार्यात्मक शैली आमतौर पर वही होती है जो आप नहीं चाहते हैं। –

+13

एह? Dict-comprehension दृष्टिकोण निश्चित रूप से "कार्यात्मक शैली" की मेरी परिभाषा के तहत आता है। –

3

0 में बजायउपयोग items():

def slicedict(d, s): 
    return {k:v for k,v in d.items() if k.startswith(s)} 
संबंधित मुद्दे

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