2016-07-19 162 views
0

我遇到的問題標題有點令人困惑,我只是不確定如何僅用標題解釋它。比較兩個python列表並將較短的列表展開爲較長列表的長度

我有兩個列表。

list_1 = [10,20,30,40,50,60,70,80,90] 
list_2 = [10,40,70] 

預期輸出:

new_list = [10,0,0,40,0,0,70,0,0] 

我應該怎麼辦呢?下面是我,我不知道是什麼病:

def expand_list(complete_list, to_be_expand_list): 
    expanded_list = [] 
    for i in complete_list: 
     for j in to_be_expand_list: 
      if i == j: 
       expanded_list.append(j) 
      else: 
       if expanded_list[-1] != 0: 
        expanded_list.append(0) 

    return expanded_list 
+0

運行代碼時會發生什麼情況。它錯誤嗎?如果是的話追溯到哪裏?它是否執行,但不符合你的期望? – Kwarrtz

+0

如果順序無關緊要:'[i [1]我在列表中(itertools.zip_longest(list_1,list_2,fillvalue = 0))]' – squiguy

回答

6

嘗試是這樣的:

def expand_list(full_list, short_list): 
    return [x if x in short_list else 0 for x in full_list] 

這將使用列表理解生成一個列表,該列表是完整列表的長度,但只包含列表那些在短名單中的元素,用零替換所有其餘的元素。

+0

短而甜,謝謝! –

2
list_1 = [10,20,30,40,50,60,70,80,90] 
list_2 = [10,40,70] 

new_list = list_1[:] 

for i, v in enumerate(list_1): 
    if v not in list_2: 
     new_list[i] = 0 

print new_list 

結果:

[10, 0, 0, 40, 0, 0, 70, 0, 0] 

這將檢查其不在list_2在LIST_1的位置,並設置他們爲0

2

您要爲complete_list上的每個項目遍歷所有to_be_expand_list,並且在每個迭代中添加一個項目(幾乎),因此最終您將擁有len(list1)*len(list2)項。

您應將其更改爲:

def expand_list(complete_list, to_be_expand_list): 
    expanded_list = [] 
    for i in complete_list: 
     if i in be_expand_list: 
      expanded_list.append(i) 
     else: 
      expanded_list.append(0) 
    return expanded_list 

如果你尋找更簡單的方法,你可以使用list comprehension

[x if x in list2 else 0 for x in list1] 
+2

感謝您解釋錯誤! –

+0

@WilsonMak不客氣 –