2016-07-19 201 views
5

che sia tale codicestringa di Spalato di cifre in elenchi di anche e interi dispari

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) 

Come può compiere stesso su un minor numero di linee?

+0

compiere ciò? –

+0

Il codice è facile da capire ed è lungo solo una manciata di righe. Usa i blocchi di base della codifica di Python. In realtà lo preferisco ad alcune delle risposte più esoteriche –

risposta

5

codice corto è il codice non è migliore. Il codice breve non è un codice più veloce. Il codice breve non è un codice gestibile. Ora, detto questo, lo è buono per rendere i vostri singoli componenti concisi e semplici.

Ecco cosa farei:

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 

Questo mi dà:

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

Anche se questo codice è in realtà aggiunto alcune righe di lunghezza, è diventato molto più chiaro ciò che il programma è facendo, come abbiamo applicato Abstraction e reso ogni componente del codice fare solo una cosa bene.

Anche se abbiamo aggiunto due funzioni, la parte più visibile del codice è passato da questa:

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) 

A tal:

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

E solo leggendo queste due linee , sappiamo che numbers viene convertito da una stringa in un elenco di int s e che quindi suddividiamo questi numeri in pari e dispari e assegniamo il risultato a nums.

Per spiegare paio aa di cose che potrebbe non essere familiare a tutti:

  • map() chiama una funzione per ogni elemento in un list (o tuple o altro iterabile), e restituisce un nuovo elenco con il risultato della chiamata della funzione su ogni articolo. In questo caso, lo usiamo per chiamare int() su ciascun elemento nell'elenco.

  • filter() chiama una funzione per ogni elemento in un list (o tuple o altro iterabile), che restituisce True o False per ogni elemento (beh, truthy or falsey), e restituisce un elenco di elementi che ha valutato per True quando la funzione è chiamato.

  • Lambda Expressions (lambda) sono come "mini-funzioni" che accettano argomenti e possono essere creati sul posto.

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) 

uscita:

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

Se volete solo provarlo:

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) 

Ma se si desidera utilizzarlo nella produzione: codice leggibile è più importante ' breve 'codice

0

Si può fare come un unico liner, ma non lo consiglierei finirlo. Il tuo codice è perfettamente a posto.

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

L'hacking della comprensione delle liste non è un buon consiglio ... – Netwave

+0

Sì, l'ho detto nella mia risposta. –

4

A aproach funzionale:

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

È possibile ottenere gli stessi risultati con itertools.groupby, in questo modo:

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

Questo è interessante, grazie per il suggerimento – micgeronimo

+0

Certo ... @ micgeronimo .. –

Problemi correlati