2016-09-05 16 views
6

Próbuję przenieść wszystkie zera na listę do końca wiersza, mój jedyny problem polega na tym, że na liście jest fałsz. Właśnie dowiedziałem się, że False == 0, więc jak przenieść wszystkie zera na tył listy i zachować fałsz nienaruszony?dodaje zero, ale nie fałsz w pytonie listy

def move_zeros(array): 
    #your code here 
    for i in array: 
     if i == 0: 
      array.remove(i) 
      array.append(i) 
    answer = array 
    print answer 

move_zeros(["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9])

To co zwraca kiedy go uruchomić.

['a', 'b', None, 'c', 'd', 1, 1, 3, [], 1, 9, {}, 9, 0, 0, 0, 0, 0, False, 0, 0, False, 0, 0] 
+2

Prawdopodobnie chcesz uniknąć Iterowanie nad listy i robi 'usunąć/append's – Andrew

+1

' Gdybym == 0 i nie jest fałsz: ' – RemcoGerlich

Odpowiedz

0
for i in array: 
    if i == 0 and i is not false: 
     array.remove(i) 
     array.append(i) 
answer = array 
print answer 
8

Co robisz jest po prostu zwyczaj sortowania. Więc po prostu wdrożyć go w ten sposób:

array.sort(key=lambda item: item is 0) 

Co to znaczy „Przekształcanie tablicy w jednym logicznym gdzie przedmioty będące 0 są prawdziwe i wszystko jest fałszywe.” Następnie sortowanie tych zmiennych powoduje umieszczenie wszystkich wartości fałszywych po lewej stronie (ponieważ są one równe 0), a wartości True po prawej (jak 1).


Początkowo miałem pisemne rozwiązanie, które nie jest obsługiwana w Pythonie 3:

array.sort(lambda L,R: -1 if R is 0 else 0) 

Co to znaczy „L jest mniejsza niż R jeśli R jest 0”. Następnie sortujemy według tego. Tak więc kończymy z zerami po prawej, ponieważ wszystko jest mniejsze od nich. Powyższe działa jednak tylko w Pythonie 2.

+0

Jest to zdecydowanie najbardziej eleganckie rozwiązanie. – gglasses

+0

Powoduje to "TypeError" z python3 –

+0

@Chris_Rands: Wow, nie zdawałem sobie sprawy, ale Python 3 całkowicie usunął parametr 'cmp' do' sort() 'i' sorted() '. Zaktualizuję swoją odpowiedź, aby uwzględnić kod zgodny z Python 3. –

3

Oto jeden sposób. Uwaga: False == 0 to True, ale False is 0 to False.

>>> l = ["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9] 
>>> [x for x in l if x is not 0] + [x for x in l if x is 0] 
['a', 'b', None, 'c', 'd', 1, False, 1, 3, [], 1, 9, {}, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

EDIT: Jest gorzej niż rozwiązań sorted, zarówno mniej elegancki i wymaga Iterowanie nad listy dwukrotnie.

4

Można użyć sorted:

sorted(array, key=lambda x: x is 0) 
+0

Podczas gdy jesteś na to możesz po prostu zrobić 'key = lambda x: x jest 0'. –

+0

Tak, racja. Dziękuję Ci. –

0

if i == 0 and type(i) is int :

Można to zrobić w powyższy sposób. Cały program wygląda jak poniżej:

def move_zeros(array): 
    #your code here 
    for i in array: 
     if i == 0 and type(i) is int: 
      array.remove(i) 
      array.append(i) 
    answer = array 
    print answer 
0

Ponieważ lista sortowania jest stabilna można zrobić

array.sort(key=(lambda x: 1 if (x==0 and x is not False) else 0)) 

porównując tożsamość w liczbach (x is 0) jest niebezpieczne, ponieważ podczas gdy normalnie pracuje, nie ma gwarancji.

Użycie numeru znacznie przyspiesza sortowanie.

Właściwie można również zrobić

sorted_array=[] 
zeroes=0 
for e in array: 
    if e==0 and e is not False: 
     zeroes+=1 
    else: 
     sorted_array.append(e) 
sorted_array.extend([0]*zeroes) 

co teoretycznie powinno być mniej pracy, ale jest propably znacznie wolniej w praktyce

0

czytam od this post że Python traktuje 0 jako wartość logiczna fałsz. Więc zawsze będzie umieszczany na końcu twoich tablic, takich jak 0. Sugeruję, aby odlewać jako typ Boolean Fałszywe jako "Fałsz", aby nie miało to wpływu na twój typ.

my_list = ["a", 0,0, "b", Brak, "c", "d", 0,1, "Fałsz", 0,1,0,3, [], 0, 1,9,0,0 {} 0,0,9]

Gdy trzeba wykorzystać jako logiczna tylko formować jako bool:

false = False 
print type(false) //output is <type 'bool'> 
0

Poniżej przedstawiono O (n) algorytm skanowania liniowego, w przeciwieństwie do podanych algorytmów O (n logn) i O (n n). Przenieś elementy inne niż 0 tylko raz i dodaj 0 w jednej partii.

def move_zeros(array): 
    "Mutate list by putting int 0 items at the end, in O(n) time." 
    dest = 0 
    zeros = 0 
    for item in array: 
     if not item and type(item) is int: # int 0 
      zeros += 1 
     else: 
      if zeros: 
       array[dest] = item 
      dest += 1 
    array[-zeros:] = [0] * zeros 

inn = ["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9] 
move_zeros(inn) 
print(inn) 
# ['a', 'b', None, 'c', 'd', 1, False, 1, 3, [], 1, 9, {}, 9, 
# 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]