从一个列表中删除另一个列表中的元素,但不完全删除该值

2024-05-19 07:08:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个项目,其中我必须根据参数listA的长度划分2个列表,数字必须按升序排列,其余元素进入列表B

def partitionLists(listA, listB, largerFirst=False):
if largerFirst == False:
    sortedA = []
    listCombination = listA + listB
    listCombination.sort()
    for i in range(len(listA)):
        if listCombination[i] <= listCombination[i + 1]:
            sortedA.append(listCombination[i])

我现在需要的是从排序列表中删除listA中的元素,但不是全部,例如,列表A是[1,1,3,4,4,5,5],而总列表是[1,1,3,3,4,4,4,5,5,5,6,7,7,7,34,45,56,65,432,543,723],所以我想返回一个只有[5,6,7,7,34,45,56,65,432,543,723]的列表,但是如果我尝试传统的删除公共元素的方法,它也会删除第二个列表中的5。对不起,如果因为我的解释,这似乎很难理解,但我希望我已经明白我的意思了


Tags: 项目false元素列表参数ifdef数字
2条回答

在您提供的示例中,似乎最好在较大的列表中循环,以查看这些元素是否在较小的列表中。如果没有,您可以将它们附加到空列表中。根据你的问题,我不确定哪个列表需要排序,但你可以在之前或之后对列表进行排序。它不应该改变您将元素附加到空列表中的能力

可以使用第一个列表上的迭代器来完成此操作,迭代器将告诉您跳过第二个列表中的哪些元素(假设两个列表都已排序):

def removeList(listA,listB):
    iterA  = iter(listA)
    valueA = next(iterA,None)
    result = []
    for valueB in listB:
        if valueB == valueA:
            valueA = next(iterA,None)
        else:
            result.append(valueB)
    return result

输出:

a = [1, 1, 3, 3, 4, 4, 5, 5]
b = [1, 1, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 34, 45, 56, 65, 432, 543, 723]
c = removeList(a,b)

print(c) 

# [5, 6, 7, 7, 34, 45, 56, 65, 432, 543, 723]

[编辑]如果列表A中可能存在列表B中不存在的数字,则需要调整方法以跳过这些值:

def removeList(listA,listB):
    iterA  = iter(listA)
    valueA = next(iterA,None)
    result = []
    for valueB in listB:
        while valueA is not None and valueA < valueB:
            valueA = next(iterA,None) # skip values in listA that are not in listB
        if valueB == valueA:
            valueA = next(iterA,None)
        else:
            result.append(valueB)
    return result

a = [1, 1, 3, 3, 4, 4, 4, 5, 5, 8]
b = [1, 1, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 34, 45, 56, 65, 432, 543, 723]
c = removeList(a,b)

print(c)

# [5, 6, 7, 7, 34, 45, 56, 65, 432, 543, 723]

相关问题 更多 >

    热门问题