2015-09-01 48 views
-3

假設我有一個數字列表,並且我想將該列表「擴展」到超出一定數量的元素。我應該如何通過添加分別是前後元素平均值的元素來擴展列表?在構建新列表時,應該如何在Python列表的兩個元素上一次循環?

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)) 
+6

你嘗試過什麼? –

+0

@MorganThrapp嗨。我已經加入了我的嘗試的開始。 – d3pd

回答

1

我想你可以這樣做:

while len(numbers) < minimumNumberOfElementsRequired: 
    index = 1 
    while index < len(numbers): 
     numbers.insert(index, (numbers[index-1] + numbers[index])/2.0) 
     index += 2 

這似乎有點尷尬,但它周圍的最簡單的方法由插入引起的移位索引。

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:] 
0

您可以使用index遍歷數字,計算以下元素的平均值,並將其插入到正確位置的列表中。同時,您需要注意的是,索引實際上是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) 
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)) 
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] 
相關問題