2016-07-19 13 views
5

posiadający taki kodPodział ciąg cyfr na listach parzystych i nieparzystych liczb

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) 

W jaki sposób można osiągnąć to samo na mniejszej liczbie linii?

+0

osiągnąć to, co? –

+0

Twój kod jest łatwy do zrozumienia i zawiera zaledwie kilka linii. Używa podstawowych bloków kodujących Pythona. Właściwie wolę to od niektórych bardziej ezoterycznych odpowiedzi. –

Odpowiedz

5

Krótki kod nie jest lepszy kod. Krótki kod to nie szybszy kod. Krótki kod nie jest możliwym do utrzymania kodem. Teraz powiedziawszy, że to jest dobre, aby twoje poszczególne elementy były zwięzłe i proste.

Oto co zrobię:

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 

To daje mi:

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

Chociaż ten kod faktycznie dodaje kilka linii długości, stało się znacznie bardziej jasne, jaki program jest robiąc, jak to aplikowaliśmy, każdy komponent kodu wykonał tylko jedną rzecz.

Nawet dodaliśmy dwie funkcje, najbardziej widoczną część kodu upadł z tego:

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) 

do tego:

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

I właśnie czytając te dwie linie , wiemy, że numbers jest konwertowany z ciągu znaków na listę int s, a następnie dzielimy te liczby na nieparzyste i parzyste, i przypiszemy wynik do nums.

Aby wyjaśnić aa kilka rzeczy, które mogą nie być znane wszystkim:

  • map() wywołuje funkcję dla każdego elementu w list (lub tuple lub inny iterable) i zwraca nową listę wynik wywołania funkcji dla każdego elementu. W tym przypadku używamy go do wywoływania int() dla każdej pozycji na liście.

  • filter() wywołuje funkcję dla każdego elementu w list (lub tuple lub inny iterable), która zwraca True lub False dla każdej pozycji (dobrze, truthy or falsey) i zwraca listę elementów, które oceniona True gdy funkcja jest nazywany.

  • Wyrażenia Lambda (lambda) są jak "mini-funkcje", które biorą argumenty i mogą być tworzone na miejscu.

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) 

wyjściowa:

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

Jeśli chcesz po prostu go wypróbować:

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) 

Ale jeśli chcesz go używać w produkcji: kod Czytelny jest ważniejsza niż ' krótki "kod

0

Możesz zrobić to jako jeden liniowiec, ale nie poleciłbym skończ to. Twój kod jest całkowicie w porządku.

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

Hackowanie ze zrozumieniem listy nie jest dobrą radą ... – Netwave

+0

Tak, powiedziałem to w mojej odpowiedzi. –

4

Funkcjonalny 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

można osiągnąć te same rezultaty itertools.groupby, tak:

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

To jest interesujące, dziękuję za sugestię – micgeronimo

+0

Pewnie ... @ micgeronimo .. –

Powiązane problemy