2017-03-14 2 views
0

Ich versuche, Merge-Sort in Python zu implementieren, und ich würde gerne wissen, was ist die Python-Art von Looping durch zwei Listen nur eine der Listen durchlaufen jede Schleife.Wie durchlaufe ich zwei Listen, die jeweils nur eine durchlaufen?

Dies ist, was ich jetzt habe

def merge(array1, array2): 
    final = [] 
    i = 0 
    j = 0 
    while i < len(array1) or j < len(array2): 
     if array1[i] <= array2[j]: 
      final.append(array1[i]) 
      i += 1 
     elif array2[j] < array1[i]: 
      final.append(array2[j]) 
      j += 1 
     # Finished one of the arrays 
     if i == len(array1): 
      final.extend(array2[j:]) 
      break 
     elif j == len(array2): 
      final.extend(array1[i:]) 
      break 
    return final 

Dank (Indizes verwenden).

+0

'while True:' + Flusskontrolle innerhalb der Schleife, die das Inkrementieren behandelt + eine Möglichkeit, dass der Code "bricht". So ähnlich wie das, was Sie tun –

+1

Dies wird fehlschlagen, da, wenn 'i> = len (array1)' aber 'j

+4

Du solltest die Frage nicht auf das Wissen von merge-sort stützen. Es wird mehr Aufmerksamkeit bekommen, wenn Sie es generisch machen, und es wird nicht mit Bugs oder Korrekturen des Algorithmus verwechselt. – slezica

Antwort

0

Ich bin nicht sicher, nicht sicher, ob Ihr Problem hier Indizes verwendet, aber es gibt eine Menge unnötigen Code.

Erstens wir Ihre initialisers ändern können:

final, i, j = [], 0, 0 

Als nächstes, wenn wir Ihre while Zustand ändern können wir die break s entfernen:

while i < len(array1) and j < len(array2): 

Ihre elif ist, da es nicht sinnvoll wird immer wahr sein, wir können also Ihre if:

if array1[i] <= array2[j]: 
    final.append(array1[i]) 
    i += 1 
else: 
    final.append(array2[j]) 
    j += 1 
machen

Und jetzt, weil wir automatisch zu brechen aus der Schleife sind, müssen wir die break s nicht und können die extend s außen bewegen:

def merge(array1, array2): 
    final, i, j = [], 0, 0 
    while i < len(array1) and j < len(array2): 
     if array1[i] <= array2[j]: 
      final.append(array1[i]) 
      i += 1 
     else: 
      final.append(array2[j]) 
      j += 1 
    final.extend(array1[i:]) 
    final.extend(array2[j:]) 
    return final 

Dies gibt Ihnen kleineren, besser lesbaren Code, ohne das wirklich zu ändern So wie du etwas machst, wirst du es immer noch verstehen.


Note, die wir durchführen kann:

final.extend(array1[i:]) 
final.extend(array2[j:]) 

außerhalb der Schleife, da ein Array Inhalt haben, beispielsweise [7,9], während der andere leer ist ([]):

>>> final = [3,6] 
>>> array1 = [3,6] 
>>> array2 = [7,9] 
>>> i = 2 
>>> j = 0 
>>> array1[i:] 
[] 
>>> array2[j:] 
[7, 9] 
>>> final.extend(array1[i:]) 
>>> final 
[3, 6] 
>>> final.extend(array2[j:]) 
>>> final 
[3, 6, 7, 9] 
Verwandte Themen