2016-07-19 8 views
5

इस तरह के कोडस्प्लिट स्ट्रिंग भी की सूची और अजीब पूर्णांकों

numbers = '1 2 3 4 5 6 7 8' 
nums = {'evens': [], 'odds': []} 

for number in numbers.split(' '): 
    if int(number) % 2: 
     nums['odds'].append(number) 
    else: 
     nums['evens'].append(number) 

कम तर्ज पर ही पूरा कर सकते हैं कैसे होने में?

+0

पूरा क्या? –

+0

आपका कोड समझना आसान है और केवल लंबी लाइनों का एक मुट्ठी भर है। यह पायथन कोडिंग के मूल निर्माण ब्लॉक का उपयोग करता है। मैं वास्तव में इसे कुछ अधिक गूढ़ उत्तरों के लिए पसंद करता हूं –

उत्तर

5

लघु कोड नहीं बेहतर कोड है। लघु कोड तेज कोड नहीं है। शॉर्ट कोड रखरखाव कोड नहीं है। अब, यह कहा गया है, आपके व्यक्तिगत घटकों को संक्षिप्त और सरल बनाने के लिए अच्छा है।

def split_odd_even(number_list): 
    return { 
     'odds': filter(lambda n: (n % 2) != 0, number_list), 
     'evens': filter(lambda n: (n % 2) == 0, number_list) 
    } 

def string_to_ints(string): 
    return map(int, numbers.strip().split()) 

numbers = '1 2 3 4 5 6 7 8 9 10' 
nums = split_odd_even(string_to_ints(numbers)) 

print nums 

यह मैं देता है::

यहाँ मैं क्या करना होगा है

{'odds': [1, 3, 5, 7, 9], 'evens': [2, 4, 6, 8, 10]} 

हालांकि इस कोड वास्तव में लंबाई में कुछ लाइनें जोड़ा गया है, यह बहुत अधिक स्पष्ट क्या कार्यक्रम है बन गया है ऐसा करना, जैसा कि हमने Abstraction लागू किया है और कोड के प्रत्येक घटक को केवल एक चीज ही बनाया है।

हालांकि हम दो काम करता है, कोड के सबसे-दृश्य भाग इस से चला गया है जोड़ दिया है: सिर्फ इन दो पंक्तियों को पढ़ कर

numbers = '1 2 3 4 5 6 7 8 9 10' 
nums = split_odd_even(string_to_ints(numbers)) 

और:

numbers = '1 2 3 4 5 6 7 8' 
nums = {'evens': [], 'odds': []} 
for number in numbers.split(' '): 
    if int(number) % 2: 
     nums['odds'].append(number) 
    else: 
     nums['evens'].append(number) 
इस के लिए

, हम जानते हैं कि numbers को स्ट्रिंग से int एस की सूची में परिवर्तित किया गया है, और फिर हम उन संख्याओं को अजीब और यहां तक ​​कि विभाजित करते हैं, और परिणाम nums पर असाइन करते हैं।

है कि सभी के लिए परिचित नहीं हो सकता है चीजों में से आ जोड़ी व्याख्या करने के लिए:

  • map() में हर आइटम के लिए एक फ़ंक्शन को कॉल एक list (या tuple या अन्य iterable), और के साथ एक नई सूची लौटाता है प्रत्येक आइटम पर फ़ंक्शन का परिणाम कहा जा रहा है। इस मामले में, हम सूची में प्रत्येक आइटम पर int() पर कॉल करने के लिए इसका उपयोग करते हैं।

  • filter() एक list (या tuple या अन्य iterable) है, जो True या False रिटर्न प्रत्येक आइटम (अच्छी तरह से, truthy or falsey) के लिए, और उस True के लिए मूल्यांकन मदों की एक सूची जब समारोह में हर आइटम के लिए एक समारोह कॉल कहा जाता है।

  • लैम्ब्डा अभिव्यक्तियां (lambda) "मिनी-फ़ंक्शंस" जैसी हैं जो तर्क लेती हैं और जगह बनाई जा सकती हैं।

1
numbers = '1 2 3 4 5 6 7 8' 
nums = {} 
nums["even"] = [int(i) for i in numbers.split() if int(i) % 2 == 0] 
nums["odd"] = [int(i) for i in numbers.split() if int(i) % 2 == 1] 
print(nums) 

आउटपुट:

{'even': [2, 4, 6, 8], 'odd': [1, 3, 5, 7]} 
1

तुम सिर्फ इसे आज़माने के लिए करना चाहते हैं:

numbers = '1 2 3 4 5 6 7 8' 
nums = {'evens': [], 'odds': []} 
for number in numbers.split(' '): 
    category = 'odds' if int(number) % 2 else 'evens' 
    nums[category].append(number) 

लेकिन आप इसे उत्पादन में उपयोग करना चाहते हैं: पठनीय कोड से अधिक महत्वपूर्ण है ' लघु 'कोड

0

आप इसे एक लाइनर के रूप में कर सकते हैं, लेकिन मैं अनुशंसा नहीं करता ख़त्म करो। आपका कोड बिल्कुल ठीक है।

[nums['odds'].append(n) if int(n)%2 else nums['evens'].append(n) for n in numbers.split(' ')] 
+0

सूची समझ हैकिंग एक अच्छी सलाह नहीं है ... – Netwave

+0

हाँ, मैंने अपने जवाब में ऐसा कहा। –

4

एक कार्यात्मक aproach:

>>> numbers = '1 2 3 4 5 6 7 8' 
>>> numbers = map(int, numbers.split()) 
>>> nums = {'evens': filter(lambda x: x%2 == 0, numbers), 'odds': filter(lambda x: x%2 != 0, numbers)} 
>>> nums 
{'evens': [2, 4, 6, 8], 'odds': [1, 3, 5, 7]} 
3

आप itertools.groupby साथ एक ही परिणाम है, तो जैसे पूरा कर सकते हैं:

>>> from itertools import groupby 
>>> 
>>> numbers = '1 2 3 4 5 6 7 8' 
>>> d = {'even':[], 'odd':[]} 
>>> mynum = [int(x) for x in numbers.strip().split()] 
>>> for k,g in groupby(mynum, lambda x: x % 2): 
     if k: 
      d['odd'].extend(g) 
     else: 
      d['even'].extend(g) 


>>> d 
{'even': [2, 4, 6, 8], 'odd': [1, 3, 5, 7]} 
+0

यह दिलचस्प है, सुझाव – micgeronimo

+0

सुझाव के लिए धन्यवाद ... @ micgeronimo .. –

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