2017-07-27 4 views
-2

Zunächst einmal, ich habe schon an diesen Stellen zum gleichen Thema sah:Typ Fehler: Kann nur ein iterable Python-Fehler kommen

TypeError: can only join an iterable python

"Can only join an iterable" python error

"Can only iterable" Python error

python error-can only join an iterable

Aber leider scheint keiner von ihnen mein Problem zu beantworten. Ich möchte eine Liste erstellen und alle Nicht-1-Werte nach Größe sortieren und dann die -1 an ihren ursprünglichen Punkt zurückgeben. Hier ist mein Code:

def sortByHeight(a): 
    treeLocations = [] 
    for everyHeight in a: 
     if everyHeight == -1: 
      treeLocations.append([(len(a)-a.index(everyHeight)), (a.index(everyHeight)-1)]) 
      a.remove(-1) 
    people = sorted(a) 
    for everyPair in treeLocations: 
     one = everyPair[1] 
     two = everyPair[0] 
     people[one:two] = -1 
    return(people) 

sortByHeight([-1, 150, 190, 170, -1, -1, 160, 180]) 

Mein Code führt den Fehler: Typeerror: kann nur zuordnen iterable auf der Leitung 11. Was bedeutet das, und wie kann ich es beheben?

+0

Sie benötigen eine Vertiefung überprüfen – Harrichael

+0

Ich habe meine Einrückung geändert, aber immer noch den Fehler ... – Bobawob

+0

'people [eins: zwei] = -1' <- Sie versuchen, einem Listenausschnitt eine ganze Zahl zuzuweisen. – zwer

Antwort

0

Das Ziel der Zuweisung ist ein slice einer Liste. Wenn Sie einem Slice einen Wert zuweisen wollen, muss es etwas sein, über das Python iterieren kann - Listen, Tupel und Strings sind Beispiele für "iterables". So

people[one:two] = [-1] 

werden die Elemente in der Scheibe mit dem einzigen Element -1 ersetzen.Sie können dies leicht im interaktiven Interpreter testen:

>>> my_list = [1, 2, 3, 4, 5] 
>>> my_list[2:3] = ['a', 'b', 'c'] 
>>> my_list 
[1, 2, 'a', 'b', 'c', 4, 5] 
>>> my_list[2:3] = -1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can only assign an iterable 
>>> 

Wenn Sie alle Elemente mit -1 dann eine mögliche Formulierung Liste Multiplikation verwenden würde ersetzen wollen eine Folge der richtigen Länge zu geben:

people[one:two] = [-1] * (two-one) 
0

Um das Problem, nach dem Sie gefragt haben, direkt anzusprechen, versuchen Sie, einem Segment ein einzelnes Element zuzuordnen (was eine Iterabilität erfordert). Aufräumen ein paar Dinge in Ihrem Beispiel, könnten Sie so etwas wie die folgenden tun:

def sortByHeight(a): 
    # Get indices of all -1's 
    treeLocations = [index for index, height in enumerate(a) if height == -1] 
    # Get list of all others 
    people = [height for height in a if height != -1] 
    # Sort list of others 
    people = sorted(people) 
    # Re-insert -1's 
    for everyIndex in treeLocations: 
     people.insert(everyIndex, -1) 
    return(people) 
0

Es ist allgemein nicht eine gute Idee, um Elemente aus einer Liste zu entfernen, die Sie iterieren, kann es zu unerwarteten führen Ergebnisse, wenn Sie nicht vorsichtig sind. Siehe Remove items from a list while iterating. Wie John Machin sagt, ist es ein bisschen wie das Sägen des Baumastes, auf dem du sitzt. ;)

Außerdem ist das Entfernen von Elementen aus einer Liste nicht so effizient: Die Liste muss von Anfang an gescannt werden, bis ein übereinstimmendes Element gefunden wird. Wenn das Element entfernt wird, müssen alle nachfolgenden Elemente nach unten verschoben werden um die Lücke zu füllen. Es ist viel besser, einen Filtervorgang auszuführen, der eine neue Liste aus den Elementen erstellt, die Sie behalten möchten.


Hier ist eine ziemlich effiziente Möglichkeit, diese Art durchzuführen. Der Trick besteht darin, die Objekte, die wir sortieren möchten, zu extrahieren, zu sortieren und dann eine Liste zu erstellen, in der die sortierten Objekte an den entsprechenden Stellen eingefügt werden.

def sortByHeight(seq): 
    ''' sort `seq`, leaving any items equal to -1 in place ''' 
    # Extract items != -1 
    a = [u for u in seq if u != -1] 
    a.sort() 
    it = iter(a) 
    result = [] 
    for u in seq: 
     result.append(u if u == -1 else next(it)) 
    return result 

data = [-1, 150, 190, 170, -1, -1, 160, 180] 
print(data) 
result = sortByHeight(data) 
print(result) 

Ausgang

[-1, 150, 190, 170, -1, -1, 160, 180] 
[-1, 150, 160, 170, -1, -1, 180, 190] 
0

Neben dem Fehler, den ich im Kommentar erwähnt, wenn Sie schauen, dies in eine viel einfachere Art und Weise zu tun, versuchen Sie dies:

def sortByHeight(a): 
    result = sorted(v for v in a if v != -1) # first sort all non -1 fields 
    for i, v in enumerate(a): # enumerate and iterate over the original list 
     if v == -1: # if the current value is -1 
      result.insert(i, -1) # put it back into the sorted list at its original position 
    return result 
+0

@Downvoter - konstruktive Kritik ist willkommen. – zwer

+0

@holdenweb - Da die Listen keine Längen ändern, ist 'insert' absolut sicher - selbst wenn alle' -1' Einträge am Ende der Liste stehen, erlaubt 'list.insert()' das Einfügen nach der letzte Index. – zwer

+0

Downvote entfernt – holdenweb

Verwandte Themen