2016-07-19 16 views
5

solchen CodeSplit Ziffernfolge in Listen von geraden und ungeraden Zahlen

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) 

haben, wie auf weniger Zeilen gleiche erreichen kann?

+0

was Erledigen? –

+0

Ihr Code ist leicht zu verstehen und ist nur eine Handvoll Zeilen lang. Es verwendet grundlegende Bausteine ​​der Python-Kodierung. Ich bevorzuge es tatsächlich zu einigen der esoterischen Antworten –

Antwort

5

Short-Code ist nicht besser Code. Kurzcode ist kein schneller Code. Der Funktionscode ist kein wartbarer Code. Nun, das sagte, es ist gut, um Ihre einzelnen Komponenten prägnant und einfach zu machen.

hier, was ich tun würde:

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 

Das gibt mir:

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

Während dieser Code tatsächlich hat ein paar Zeilen lang hinzugefügt, hat es viel mehr klar, was das Programm geworden ist tun, wie wir Abstraction angewendet haben und machte jede Komponente des Codes nur eine Sache gut.

Obwohl wir haben zwei Funktionen hinzugefügt, die am meisten sichtbaren Teil des Codes hat sich von dieser weg:

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) 

Um dies:

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

Und nur durch diese beiden Zeilen lesen Wir wissen, dass numbers aus einer Zeichenfolge in eine Liste von int s konvertiert wird, und dass wir diese Zahlen dann in ungerade und gerade aufteilen und das Ergebnis nums zuweisen.

Um aa paar Dinge zu erklären, die nicht alle vertraut sind:

  • map() ruft eine Funktion für jedes Element in einem list (oder tuple oder andere iterable) und gibt eine neue Liste mit das Ergebnis der Funktion, die für jeden Artikel aufgerufen wird. In diesem Fall verwenden wir es, um int() für jedes Element in der Liste aufzurufen.

  • filter() ruft eine Funktion für jedes Element in einer list (oder tuple oder anderer iterable), die True oder False für jedes Element zurückzugibt (na ja, truthy or falsey), und gibt eine Liste der Elemente, die zu True ausgewertet, wenn die Funktion wird genannt.

  • Lambda-Ausdrücke (lambda) sind wie "Mini-Funktionen", die Argumente übernehmen und in-Place erstellt werden können.

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) 

Ausgang:

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

Wenn Sie nur wollen es ausprobieren:

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) 

Aber wenn man es in der Produktion verwenden möchten: lesbarer Code ist wichtiger als ' Kurz 'Code

0

Sie können es als Einliner tun, aber ich würde nicht empfehlen beende es. Dein Code ist vollkommen in Ordnung.

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

Liste Verständnis Hacking ist kein guter Tipp ... – Netwave

+0

Ja, sagte ich so in meiner Antwort. –

4

Funktionelles 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

Sie können die gleichen Ergebnisse mit itertools.groupby erreichen, etwa so:

>>> 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

Das ist interessant, danke für den Vorschlag – micgeronimo

+0

Sicher ... @ micgeronimo .. –

Verwandte Themen