2012-11-27 84 views
0

我有兩個列表(不同長度)。整個程序中有一個改變(list1),其他(更長)不改變(list2)。基本上我有一個功能,應該比較兩個列表中的元素,並且如果list1中的某個元素位於list2中,那麼list2副本中的該元素將更改爲「A」,並且該副本中的所有其他元素將更改爲'B'。當list1中只有一個元素時,我可以使其工作。但由於某些原因,如果該列表較長,list2輪流到B所有元素....Python:如果元素在一個列表中,改變其他元素?

def newList(list1,list2):   
    newList= list2[:] 
    for i in range(len(list2)): 
     for element in list1: 
      if element==newList[i]: 
       newList[i]='A' 
      else: 
       newList[i]='B' 
    return newList 
+0

如果是這樣'NEWL ist = list2 [:]'? (而不是'newList:list2 [:]'?) – mgilson

+0

OH!哦,是的。 – user1730110

回答

0

這可能是因爲不是

newList: list2[:] 

你應該有

newList = list2[:] 

個人而言,我更喜歡以下語法,我發現它更加明確:

import copy 
newList = copy.copy(list2) # or copy.deepcopy 

現在,我想這裏的問題的一部分也是,你的函數和本地變量都使用相同的名稱newList。這不太好。這裏

def newList(changing_list, static_list): 
    temporary_list = static_list[:] 
    for index, content in enumerate(temporary_list): 
     if content in changing_list: 
      temporary_list[index] = 'A' 
     else: 
      temporary_list[index] = 'B' 
    return temporary_list 

請注意,你有沒有講明什麼時候有在list1list2多個條目匹配做。我的代碼標記了所有匹配的代碼'A'。例如:

>>> a = [1, 2, 3] 
>>> b = [3,4,7,2,6,8,9,1] 
>>> newList(a,b) 
['A', 'B', 'B', 'A', 'B', 'B', 'B', 'A'] 
1

試試這個:

newlist = ['A' if x in list1 else 'B' for x in list2] 

適用於以下例子,我希望我理解正確嗎?如果B中的值存在於A中,請插入'A',否則將'B'插入新列表中?

>>> a = [1,2,3,4,5] 
>>> b = [1,3,4,6] 
>>> ['A' if x in a else 'B' for x in b] 
['A', 'A', 'A', 'B'] 
0

我覺得這是你想要做什麼,可以把newLis =列表2 [:],而不是下面的,但更喜歡在這些情況下使用的列表:

def newList1(list1,list2):   
    newLis = list(list2) 
    for i in range(len(list2)): 
      if newLis[i] in list1: 
       newLis[i]='A' 
      else: newLis[i]='B' 
    return newLis 

答案通過

newList1(range(5),range(10)) 

是:

['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'] 
相關問題