Frage Fügen Sie einen Wert nach einem anderen Wert in eine Liste ein


Ich möchte eine Funktion namens insert_after das wird eine Liste und zwei Werte (search_value und value).

Die Funktionalität sollte dann eingefügt werden value nach dem ersten Auftreten von search_value

Ob search_value ist nicht in der Liste, dann fügen Sie es zum Ende hinzu. Ich würde gerne ein verwenden try...except Anweisung, dies zu tun.

Zum Beispiel, wenn die Liste ist:

myList = [4,2,6,7,8,1], 

dann der Funktionsaufruf:

insert_after(myList, 7, 5)

sollte zurückkehren:

[4,2,6,7,5,8,1]

Ich habe es versucht, aber mein Wert wird immer am Ende der Liste eingefügt, obwohl ich den Index angegeben habe.

def insert_after(list1, search_value, value):
    try:
        for i in list1:
            if i == search_value:
                list1.insert(search_value+1,value)
            else:
                list1.insert(len(list1)+1,value)
    except:
        list1.insert(len(list1)+1,value)

5
2018-03-24 12:31


Ursprung


Antworten:


Sie müssen zuerst den Index von finden search_value in der Liste, die mit dem gemacht werden kann .index Methode. Dann können Sie das verwenden .insert Methode zum Einfügen der value an der Position danach (der Index +1).

Wir müssen jedoch den Fall berücksichtigen, in dem search_value ist nicht im lst. Dazu verwenden wir einfach ein try...except den ValueError denn wenn die .index schlägt fehl. Und in diesem Fall möchten wir entweder anhängen lst, oder .insert Am Ende; entweder funktioniert.

def insert_after(lst, search_value, value):
    try:
        lst.insert(lst.index(search_value)+1, value)
    except ValueError:
        lst.append(search_value)
        #or: lst.insert(len(lst)-1, value)

und ein Test:

>>> l = [4, 2, 6, 7, 8, 1]
>>> insert_after(l, 7, 5)
>>> l
[4, 2, 6, 7, 5, 8, 1]

Warum hat deine Methode nicht funktioniert?

Wenn wir uns Ihre Haupteinfügungslinie genau ansehen:

list1.insert(search_value+1,value)

wir können sehen, dass Ihre Logik etwas aus ist. Das .insert Methode nimmt einen Index und einen Wert. Hier passierst du search_value+1 als die Index obwohl das wirklich nur der Wert ist.

Hoffentlich kannst du von meinem Code aus sehen, dass mit dem .index Methode ist der richtige Weg zu gehen, da es uns das gibt Index dieses Wertes - uns erlauben zu benutzen .insert korrekt.

Was ist, wenn Sie nicht verwenden möchten? .index?

Also, ja, du könnte benutze einen for-loop, aber anstatt über die Begriffe wie Sie zu iterieren, möchten Sie wirklich über die Werte iterieren und die Indizes. Dies kann erreicht werden mit enumerate().

Also, ich werde Sie dies in eine Funktion von sich selbst setzen, da es wahrscheinlich ist, dass Sie am Ende mit der Verwendung der .index Methode, aber die Grundidee wäre etwas in Richtung:

for i, e in enumerate(lst):
    if e == search_value:
        lst.insert(i+1, value)

5
2018-03-24 12:40



Syntax von insert => list1.insert (index, element);

Hier geben Sie jedoch Suchwert ein. Außerdem können Sie mit der Indexfunktion den Index eines Wertes in der Liste abrufen.

die Funktion sieht so aus.

def insert_after(list1, search_value, value):
try:
    index = list1.index(search_value);
    list1.insert(index+1,value);
except:
    list1.insert(len(list1)+1,value)

Wenn der Wert in der Liste nicht vorhanden ist, wird ValueError ausgelöst.


1
2018-03-24 12:41



def get_index(mylist, search_value):
    """return index number; returns -1 if item not found"""
    try:
        return mylist.index(search_value)
    except ValueError as ve:
        # ValueError would be thrown if item not in list
        return -1  # returns -1 if item not in list

def insert_after(list1, search_value, value):
    index = get_index(list1, search_value)
    if index != -1:
        """inserts after index"""
        list1.insert(index + 1, value)
    else:
        """appends to the end of list"""
        list1.append(value)

0
2018-03-24 12:40



Eine weitere Möglichkeit besteht darin, den Index der Einfügung mit einem Generator zu finden. Dies ermöglicht es, einen Standardwert anzugeben, um die Ausnahmebehandlung von auszublenden list.index.

Hier ist eine Lösung, die erstellt eine neue Liste.

def insert_after(list1, search_value, value):
    i = next((i + 1 for i in range(len(list1)) if list1[i] == search_value), len(list1))
    return [*list1[:i], value, *list1[i:]]

insert_after([1, 2, 3], 2, 'foo') # [1, 2, 'foo', 3]
insert_after([1, 2, 3], 10, 'bar') # [1, 2, 3, 'bar']

Und hier ist eine Lösung, die mutiert Ihre bestehende Liste.

def insert_after(list1, search_value, value):
    i = next((i + 1 for i in range(len(list1)) if list1[i] == search_value), len(list1))
    list1.insert(i, value)

list1 = [1, 2, 3]
insert_after(list1, 2, 'foo')

list1 # [1, 2, 'foo', 3]

0
2018-03-24 16:12



Um dies zu erreichen, müssen Sie den Indexwert für den Punkt erhalten, an dem Sie Ihren Wert einfügen möchten.

def insert_after(myList, i, j):
    try:
        myList.insert(myList.index(i)+1, j)
    except ValueError:
        myList.append(j)

Sie können ein bisschen mehr auf Listen hier lesen; https://docs.python.org/2/tutorial/datastructures.html


0
2018-03-24 12:44