Python:如果一个列表中的元素,更改其他元素?

时间:2012-11-27 05:39:42

标签: python list comparison

我有两个(不同长度)的列表。一个在整个程序中发生变化(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

3 个答案:

答案 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

请注意,当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']

答案 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']