2017-02-09 48 views
2

在Python(3.5)插入從一個列表值到另一個,如果我有一長列是這樣的:蟒 - 在預先定義的點

long_list = ['0','1','0','1','0','0'.'0'.'1','1','0'] 

和較短的列表長度等於的數「1'在long_list,就像這樣:

short_list = [8,7,6,5] 

我將如何創建一個新的列表‘插入’我short_list的值代入我的long_list在每個地方有一個指數的‘1’,而對於一致性的緣故,用一些數字(比如99)代替long_list中的'0'。

我可以用一個令人痛苦的for循環來做到這一點,但它似乎應該有一種方式來更有效地與列表理解,沒有?

# bad solution 
new_list = [] 
x = 0 
for i in range(len(long_list)): 
    if long_list[i] == '0': 
     new_list.append(99) 
    else: 
     new_list.append(short_list[x]) 
     x += 1 

所需的輸出:

new_list = [99,8,99,7,99,99,99,6,5,99] 
+0

你確定'short_list'中的值總是和'long_list'中的''1'一樣多嗎? – roganjosh

+0

是的,對於這個應用程序有。最終名單源自長列表。可能太多的信息來解釋實際使用情況(上面的例子是基於真實數據的玩具示例),但我確信短名單的值與'1'的值完全相同。 – user1895076

回答

8

打開short_list一個迭代器,並使用列表理解從那裏得到值爲每個'1',否則使用固定的值:

>>> long_list = ['0','1','0','1','0','0','0','1','1','0'] 
>>> short_list = [8,7,6,5] 
>>> it = iter(short_list) 
>>> [next(it) if x == '1' else 99 for x in long_list] 
[99, 8, 99, 7, 99, 99, 99, 6, 5, 99] 

這顯然只能如果short_list與上的1具有相同數量或更多的元素0。上面有O(n)時間複雜度其中nlong_list中元素的數量。請注意,這對於所有種類的迭代器都是一樣的,long_listshort_list可能是發生器,最終結果將是相同的。

+0

謝謝,這個作品效果很好,而且速度非常快(在我真正的「long_list」中有不到一秒的時間裏有200,000多件物品)。我應該更頻繁地使用迭代器。 – user1895076

3

如果沒有與改變short_list一個問題,你可以試試下面的使用list comprehension

[short_list.pop(0) if i == '1' else 99 for i in long_list] 

輸出:

>>> long_list = ['0', '1', '0', '1', '0', '0', '0', '1', '1', '0'] 
>>> short_list = [8, 7, 6, 5] 
>>> 
>>> [short_list.pop(0) if i == '1' else 99 for i in long_list] 
[99, 8, 99, 7, 99, 99, 99, 6, 5, 99] 
0

不,這是最好的方式,但它不需要新的變量。

[99 if long_list[i] == '0' else short_list[long_list[:i].count('1')] 
for i in range(len(long_list))]