我有两个(不同长度)的列表。一个在整个程序中发生变化(list1
),另一个(更长)不变(list2
)。基本上我有一个函数可以比较两个列表中的元素,如果list1
中的元素在list2
中,list2
副本中的元素将更改为'A ',并且副本中的所有其他元素都更改为'B'。当list1
中只有一个元素时,我可以让它工作。但由于某种原因,如果列表较长,list2
中的所有元素都会转向B ....
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 :(得分: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']
答案 1 :(得分: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
请注意,当list1
和list2
中有多个条目匹配时,您尚未明确该怎么做。我的代码标记了所有匹配的'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']
答案 2 :(得分:0)
我认为这是你想要做的,并且可以使用newLis = list2 [:]而不是以下内容,但在这些情况下更喜欢使用list:
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']