Как вставить элемент после каждого другого элемента в списке python

Здравствуйте, я хотел бы знать, как использовать цикл for для просмотра списка и вставки элемента после каждого элемента в новый список.

Я просмотрел эту ссылку Вставить элемент в список Python после каждого n-го элемент

но когда я попробовал этот метод, у меня была точно такая же проблема при реализации его в моем коде.

"""
Created on Sat Mar 28 20:40:37 2020

@author: DeAngelo
"""

import math 
import matplotlib.pyplot as plt
import numpy as np
from numpy import sqrt
from quadpy import quad
import scipy.integrate as integrate
import scipy.special as special

experiment = [1,2,3,4,5]
count = len(experiment)

after = []
new = []
for i in range(0,count-1):
    average2 = (experiment[i] + experiment[i+1])/2
    new.append(average2)

print(experiment)

for i in range(0,count-1):
      just = experiment.insert(i+1,new[i])

print(new,'\n')      
print(experiment)

1st print(experiment) -> [1, 2, 3, 4, 5]

print(new,'\n') -> [1.5, 2.5, 3.5, 4.5] и 2nd, print(experiment) -> [1, 1.5, 2.5, 3.5, 4.5, 2, 3, 4, 5]

Но я хочу, чтобы это было [1,1.5,2,2.5,3,3.5,4,4.5,5] Я знаю, что могу использовать слияние и сортировку, но не хочу, потому что Я работаю с НАМНОГО большим списком, и его невозможно отсортировать. Это только мой список детей на данный момент.

Я очень близко, я чувствую это, это как шестое чувство... Любая помощь и руководство очень ценятся. Спасибо большое милашка


person Deangelo Wooley    schedule 29.03.2020    source источник
comment
Взгляните на функцию zip().   -  person Jens    schedule 29.03.2020
comment
Пожалуйста, сократите свой код до минимума, чтобы воспроизвести вашу проблему - например, импорт бесполезен. Кроме того, четко объясните, как вы должны строить свой вывод из вашего ввода.   -  person Thierry Lathuille    schedule 29.03.2020


Ответы (4)


Многократная вставка в середину списка будет очень медленной для большого набора данных. Кажется, вы можете просто создать новый список, как вы это делаете:

first = [1, 2, 3, 4, 5]
second = []
for i in range(0, len(first) - 1):
    avg = (first[i] + first[i+1]) / 2
    second.append(first[i])
    second.append(avg)
second.append(first[-1])

print(second)

Что печатает:

[1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5]
person kingkupps    schedule 29.03.2020
comment
Я просто хотел бы выразить вам свою благодарность. Вы действительно помогли мне. Мне просто любопытно, что делает second.append(first[-1]). Я этого не понимаю, но это работает, и это все, что имеет значение. :) - person Deangelo Wooley; 29.03.2020
comment
Нет проблем рад помочь! Строка second.append(first[-1]) добавляет последний элемент first в конец second. Индексы Python могут быть отрицательными числами, и когда они есть, они идут справа налево (или сзади наперед), поэтому -1 - это последний элемент, -2 - предпоследний элемент и так далее. - person kingkupps; 29.03.2020

В качестве попытки создать требуемый список вывода за один проход с использованием понимания списка я предлагаю следующее:

e = [1, 2, 3, 4]

r = [e[i] if j == 0 else sum(e[i:i+2])/2. for i in range(len(e)) for j in range(min(len(e) - i, 2))]

assert r == [1, 1.5, 2, 2.5, 3, 3.5, 4]

Я использую вложенный цикл for только для переключения между передачей исходного элемента для вывода и вычислением среднего значения последующих элементов.

person dlask    schedule 29.03.2020

Для меня это выглядит как задача для roundrobin из рецептов itertools, то есть:

from itertools import cycle, islice
def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    # Recipe credited to George Sakkis
    pending = len(iterables)
    nexts = cycle(iter(it).__next__ for it in iterables)
    while pending:
        try:
            for next in nexts:
                yield next()
        except StopIteration:
            pending -= 1
            nexts = cycle(islice(nexts, pending))

a = [1, 2, 3, 4, 5]
b = [10, 20, 30, 40]
ab = list(roundrobin(a,b))
print(ab)

Выход:

[1, 10, 2, 20, 3, 30, 4, 40, 5]

Обратите внимание, что roundrobin может использоваться для чередования более двух итераций и всегда завершается на самом длинном. Поскольку вы работаете с НАМНОГО большим списком, у вас есть дополнительное преимущество в виде generator, а не list.

person Daweo    schedule 29.03.2020

вы можете использовать это однострочное понимание списка

from itertools import zip_longest

a = [1,2,3,4,5]
b = [1.5, 2.5, 3.5, 4.5]
flat_list = [val for sublist in zip_longest(a,b) for val in sublist if val]

вывод = [1, 1,5, 2, 2,5, 3, 3,5, 4, 4,5, 5]

person ishmam    schedule 29.03.2020