0
votes

Python - insérer un élément à un index spécifique sans utiliser la fonction d'insertion

juste un avertissement. Mon code est probablement loin. Je suis nouveau et je fais de mon mieux pour le comprendre mais je me bats

Jusqu'à présent, j'ai ceci:

['two']
['p']
None

c'est le code appelant ma fonction:

[1, 2, 3, 4, 5, 6]]

et:

['one', 'two', 'three', 'four', 'five', 'six']
['p', 'i', 't']
['s', 'p', 'i', 't']
['s', 'p', 'i', 't', 's']

Suis-je loin de ma solution? Je veux vraiment comprendre où je vais mal

La sortie est censée être:

num_list2 = [1, 3, 4, 5, 6]
num_list2 = list_function.insert_value(num_list2, 2, 1)
print(num_list2)

et:

str_list3 = ['one','three','four', 'five', 'six']
new_list = list_function.insert_value(str_list3, 'two', 1)
print(new_list)
str_list4 = ['i', 't']
str_list4 = list_function.insert_value(str_list4, 'p', 0)
print(str_list4)
str_list4 = list_function.insert_value(str_list4, 's', -1)
print(str_list4)
str_list4 = list_function.insert_value(str_list4, 's', 7)
print(str_list4)

ma sortie est:

def insert_value(my_list, value, insert_position):

    new_list = []
    for i in range(len(my_list)):
        if i == insert_position:
            new_list.append(value)
            i += 1

            return new_list

c'est tout ce que je reçois


9 commentaires

pouvez-vous partager ce que votre code renvoie qui est inattendu? Cela nous aidera à vous aider.


vient de le mettre à jour


Votre indentation est désactivée sur la def et son contenu. Je le réparerais pour vous mais je ne sais pas où vous voulez que le return new_list soit. Dois-je essayer et vous me direz si j'ai bien compris?


J'essaie toujours de le comprendre moi-même, mais si vous pouviez peut-être essayer et je peux vérifier. J'apprécierais tellement l'aide


D' accord, tout ce que je faisais était tiret les choses sous les def 4 places par ligne afin qu'ils qu'ils restent alignés avec la définition.


python vous fournit le list.insert(position, element) ne pouvez-vous pas utiliser cela au lieu de créer le vôtre?


@JoeFerndz Je pense que cette méthode ne gère pas les indices négatifs comme OP le souhaite, par exemple, si la position est -1 cette méthode insère l'élément en tant que deuxième à partir de la fin plutôt que comme le premier élément comme OP le souhaite, en fonction de leurs attentes production. Ils auraient donc encore besoin d'ajouter une partie de leur propre logique.


@ShashSinha, bon appel. Pour le scénario négatif, je viens de faire if insert_position < 0: insert_position = (-insert_position) - 1 . Ou si nous voulons que toutes les valeurs négatives aboutissent à la 0ème position, alors insert_position = 0 . Avec cela, nous pouvons toujours utiliser my_list.insert(insert_position,value) pour obtenir la réponse souhaitée.


@JoeFerndz Yup qui fonctionnerait.


5 Réponses :


0
votes

Vous êtes en fait extrêmement proche, il vous suffit d'ajouter quelques vérifications de limites:

['one', 'two', 'three', 'four', 'five', 'six']
['p', 'i', 't']
['s', 'p', 'i', 't']
['s', 'p', 'i', 't', 's']
[1, 2, 3, 4, 5, 6]

Production:

def insert_value(my_list, value, insert_position):
    if insert_position < 0:
        insert_position = 0
    elif insert_position >= len(my_list):
        insert_position = len(my_list)
    
    new_list = []
    for i in range(len(my_list)):
        if i == insert_position:
            new_list.append(value)
        new_list.append(my_list[i])
    
    if len(my_list) == insert_position:
        new_list.append(value)
    
    return new_list
    
str_list3 = ['one', 'three', 'four', 'five', 'six']
new_list = insert_value(str_list3, 'two', 1)
print(new_list)
str_list4 = ['i', 't']
str_list4 = insert_value(str_list4, 'p', 0)
print(str_list4)
str_list4 = insert_value(str_list4, 's', -1)
print(str_list4)
str_list4 = insert_value(str_list4, 's', 7)
print(str_list4)

num_list2 = [1, 3, 4, 5, 6]
num_list2 = insert_value(num_list2, 2, 1)
print(num_list2)


1 commentaires

C'est bien. Merci beaucoup. Je vais passer un peu de temps là-dessus pour comprendre comment cela fonctionne. Merci!!



0
votes

Vous êtes assez proche sauf que vous avez négligé d'insérer les lignes de la liste d'origine et que vous revenez à l'intérieur de la boucle au lieu de l'avoir fait. De plus, il n'est pas nécessaire d'incrémenter i . Il est réaffecté à la boucle suivante avec la valeur suivante de la range . Fondamentalement, la range remplace l'incrément.

def insert_value(my_list, value, insert_position):
    new_list = []
    for i,v in enumerate(my_list):
        if i == insert_position:
            new_list.append(value)
        new_list.append(v)
    return new_list
    
str_list3 = ['one','three','four', 'five', 'six']
new_list = insert_value(str_list3, 'two', 1)
print(new_list)

Au lieu de range vous pouvez utiliser enumerate qui compte mais qui vous donne également les lignes itérées, vous n'avez donc pas à indexer à nouveau le tableau.

def insert_value(my_list, value, insert_position):
    new_list = []
    for i in range(len(my_list)):
        if i == insert_position:
            new_list.append(value)
        new_list.append(my_list[i])
    return new_list

str_list3 = ['one','three','four', 'five', 'six']
new_list = insert_value(str_list3, 'two', 1)
print(new_list)


2 commentaires

Je ne pense pas que cette génération de supports de sortie prévue OP lors du passage dans un négatif insert_position , par exemple -1 ou une position d'insertion qui est plus grand que la longueur du courant my_list , par exemple, 7 .


Merci pour l'aide. C'était proche et m'a permis de mieux comprendre comment cela fonctionne



0
votes

Vous avez déjà quelques réponses sur cette question. Voici une autre option à considérer:

['one', 'two', 'three', 'four', 'five', 'six']
['p', 'i', 't']
['s', 'p', 'i', 't']
['s', 'p', 'i', 't', 's']
[1, 2, 3, 4, 5, 6]

Le résultat pour ceux-ci sera:

def insert_value(my_list, value, insert_position):
    if insert_position < 0:
        insert_position = (-insert_position) - 1

    #if you want any negative value to result in position 0
    #then your insert_position assignment will be
    #if insert_position < 0: insert_position = 0
    #the rest of the code will remain the same

    my_list.insert(insert_position,value)

    return my_list

str_list3 = ['one','three','four', 'five', 'six']
new_list = insert_value(str_list3, 'two', 1)
print(new_list)
str_list4 = ['i', 't']
str_list4 = insert_value(str_list4, 'p', 0)
print(str_list4)
str_list4 = insert_value(str_list4, 's', -1)
print(str_list4)
str_list4 = insert_value(str_list4, 's', 7)
print(str_list4)

num_list2 = [1, 3, 4, 5, 6]
num_list2 = insert_value(num_list2, 2, 1)
print(num_list2)


0 commentaires

0
votes

#fonction personnalisée pour l'insertion

['one', 'two', 'three', 'four', 'five', 'six']
['p', 'i', 't']
['s', 'p', 'i', 't']
['s', 'p', 'i', 't', 's']
[1, 2, 3, 4, 5, 6]

exemple

str_list3 = ['one','three','four', 'five', 'six']
new_list = insert_value(str_list3, 'two', 1)
print(new_list)
str_list4 = ['i', 't']
str_list4 = insert_value(str_list4, 'p', 0)
print(str_list4)
str_list4 = insert_value(str_list4, 's', -1)
print(str_list4)
str_list4 = insert_value(str_list4, 's', 7)
print(str_list4)

num_list2 = [1, 3, 4, 5, 6]
num_list2 = insert_value(num_list2, 2, 1)
print(num_list2)

Le résultat pour ceux-ci sera:

insert_value =lambda a,value,idx: a[:idx] + [value] + a[idx:]

0 commentaires

0
votes

Un autre exemple mais la liste des sources changera si besoin vous pouvez la copier

Syntaxe: lst [index: index] = [obj]

Voici sans fonction personnalisée

['one', 'two', 'three', 'four', 'five', 'six']
['p', 'i', 't']
['s', 'p', 'i', 't']
['s', 'p', 'i', 't', 's']
[1, 2, 3, 4, 5, 6]

Le résultat pour ceux-ci sera:

str_list = ['one','three','four', 'five', 'six']
str_list[1:1]=['two']
print(str_list)

str_list1=['i', 't']
str_list1[0:0]='p'
print(str_list1)
str_list1[-1:-1]=['s']
print(str_list1)
str_list1[7:7]=['s']
print(str_list1)

num_list2 = [1, 3, 4, 5, 6]
num_list2[1:1]=[2]
print(num_list2)


0 commentaires