Как вставить элемент после каждого другого элемента в списке python - PullRequest
0 голосов
/ 29 марта 2020

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

Я посмотрел по этой ссылке Вставка элемента в список 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] Я знаю, что могу использовать слияние и сортировку , но я не хочу, потому что я работаю с НАМНОГО большим списком, и он не может быть отсортирован. Это только мой список детей на данный момент.

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

Ответы [ 5 ]

2 голосов
/ 29 марта 2020

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

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]
1 голос
/ 29 марта 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]

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

1 голос
/ 29 марта 2020
experiment = [1, 2, 3, 4, 5]
count = len(experiment)

for i in range(count - 1):
    experiment.insert(2*i+1, (experiment[2*i] + experiment[2*i+1])/2)

print(experiment)
0 голосов
/ 29 марта 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]

output = [1, 1,5, 2, 2,5, 3, 3,5, 4, 4,5, 5]

0 голосов
/ 29 марта 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...