假设我有一个数字列表,我希望将该列表“扩展”到超过一定数量的元素。我应该如何通过添加分别是前一个和后一个元素的平均值的元素来扩展列表?
numbers = [1, 2, 3, 4, 5]
minimumNumberOfElementsRequired = 15
# do magic here
# first iteration: [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5]
# second iteration: [1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4, 4.25, 4.5, 4.75, 5]
# have sufficient number of elements => return list
print(numbers_extended)
# output: [1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4, 4.25, 4.5, 4.75, 5]
我尝试的开始如下:
list1 = [1, 2, 3, 4, 5]
list2 = [1, 2, 3, 4, 5]
index = -1
iterator = iter(list1)
for x, y in zip(iterator, iterator):
index += 1
list2.insert(index, (x + y) / float(2))
答案 0 :(得分:1)
我猜你可以这样做:
while len(numbers) < minimumNumberOfElementsRequired:
index = 1
while index < len(numbers):
numbers.insert(index, (numbers[index-1] + numbers[index]) / 2.0)
index += 2
看起来有点尴尬,但它是插入引起的转移指数的最简单方法。
答案 1 :(得分:1)
它不是最优雅的解决方案,但它确实有效。
numbers = [1,2,3,4,5]
while len(numbers) < 15:
new_numbers = []
for i, value in enumerate(numbers[:-1]):
mean = (value + numbers[i+1])/2.0
new_numbers.extend([value, mean])
numbers = new_numbers + numbers[-1:]
答案 2 :(得分:0)
您可以使用索引迭代数字,计算以下元素的平均值,并将其插入到正确位置的列表中。同时,您需要注意索引实际上是i*2
,因为元素在等待时会添加到列表中。
while len(numbers) < minimum_length:
for i in range(len(numbers) - 1):
j = i*2
a, b = numbers[j], numbers[j + 1]
mean = (a + b)/2
numbers.insert(j + 1, mean)
答案 3 :(得分:0)
reduce
(由Yaroslav Admin建议)。
addnew
函数接受一个列表和一个要追加的新项目。
from functools import reduce # if python3
numbers = [1, 2, 3, 4, 5]
minlen = 15
def addnew(lst, x):
if lst:
lst.append((lst[-1] + x)/2)
lst.append(x)
return lst
while len(numbers) <= minlen:
numbers = reduce(addnew, numbers, [])
print(list(numbers))
答案 4 :(得分:0)
这是一种迭代的方法:
try:
from itertools import izip
except ImportError: # Python 3
izip = zip
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = iter(iterable), iter(iterable)
next(b, None)
return izip(a, b)
def add_means(num_list):
r = [num_list[0]]
for pair in pairwise(num_list):
r.extend([sum(pair)/2.0, pair[1]])
return r
def extend_list(numbers, min_elements):
while len(numbers) < min_elements:
numbers = add_means(numbers)
return numbers
numbers = [1, 2, 3, 4, 5]
minimumNumberOfElementsRequired = 15
print(extend_list(numbers, minimumNumberOfElementsRequired))
输出:
[1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4, 4.25, 4.5, 4.75, 5]