修改列表删除元素而不造成混乱

2024-10-01 07:16:42 发布

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

我现在正试图解决一个听起来像这样的任务:

''write a function modi(la, lb) that takes in input 2 lists la and lb that have the same number of elements inside. The function should modify lists la and lb camparing elements with the same indexes in two lists and deleting a bigger one, if elements are equal function delete both of them. ''

例如:

  • la=['熊'、'虎'、'狼'、'鲸'、'大象']
  • lb=[“天鹅”、“猫”、“狗”、“鸭”、“兔子”]

所以functin应该返回: [“熊”,“大象”] [“猫”,“狗”,“鸭”]

我已经编写了下一段代码,但它不会修改列表,而是创建新的列表并添加这些元素。有什么办法吗?你知道吗

def confront(s1, s2):   

    if s1 < s2:   # condition that tells which element to choose later
        return 0
    elif s2 < s1:
        return 1
    else:
        return 2


def modi(la,lb):

    latemp = []

    lbtemp = []

    i = 0

    while i < len(la):


        q = confront(la[i], lb[i])
        if q == 0:
            latemp.append(la[i])

        elif q == 1:
            lbtemp.append(lb[i])


        i +=1  
    la = latemp
    lb = lbtemp
    return la, lb

我试过remove(),但结果弄得一团糟


Tags: andinreturnifthatfunctionelementsla
3条回答

通常,当您在遍历列表时对其进行变异时。最好的做法是迭代一个副本。下面是一个例子,你会做什么变异一个名单。你知道吗

list = []
list_copy = list[:]
for i in list_copy:
    list.remove(i)
return list

这允许您在每次迭代中保持正确的索引。你知道吗

下面是我试图解释我的意思,并使用for循环来获得预期的结果。希望有帮助。你知道吗

def confront(s1, s2):

if s1 < s2:   # condition that tells which element to choose later
    return 0
elif s2 < s1:
    return 1
else:
    return 2


def modi(la,lb):
    la_copy = la[:]
    lb_copy = lb[:]

    for i in range(len(la_copy)):
        q = confront(la_copy[i], lb_copy[i])
        if q == 0:
            lb.remove(lb_copy[i])
        elif q == 1:
            la.remove(la_copy[i])

    return la, lb


la = ['bear', 'tiger', 'wolf', 'whale', 'elephant']
lb = ['swan', 'cat', 'dog', 'duck', 'rabbit']

通过print()调用它将得到返回的两个列表。你知道吗

注意:这将返回一个元组。如果你想要单独的列表,请通过以下方式调用它。你知道吗

list1, list2 = modi(la,lb)
print(list1)
print(list2)
['bear', 'elephant']
['cat', 'dog', 'duck']

这会解决你的问题。我认为这比其他解决方案都简单。你知道吗

def modi(la, lb):
    new_la = []
    new_lb = []
    for a, b in zip(la, lb):
        if a == b:
            continue
        if a > b:
            new_lb.append(b)
        if a < b:
            new_la.append(a)
    return new_la, new_lb

但是,如果要更改现有列表,可以执行以下操作:

def modi(la, lb):
    del_la = []
    del_lb = []
    for i, (a, b) in enumerate(zip(la, lb)):
        if a == b:
            del_la.append(i)
            del_lb.append(i)
        if a > b:
            del_la.append(i)
        if a < b:
            del_lb.append(i)
    for x in del_la[-1::-1]:
        del la[x]
    for x in del_lb[-1::-1]:
        del lb[x]
    return la, lb

在您自己的代码la = latemplb = lbtemp中,创建对函数本地的两个新列表的引用,它们与您传递给函数的列表没有关系。根据您的规范,您应该修改传入的列表,而不是重新分配或创建新的列表。你知道吗

由于您正在进行元素比较,因此可以使用zip并根据规格从每个列表中删除:

def modi(la, lb):
    for i, j in zip(la, lb):
        # both the same
        if i == j:
            la.remove(i) 
            lb.remove(i)
        # element from la is bigger
        elif i > j:
            la.remove(i)
        # else element from lb must be bigger
        else:
            lb.remove(j)


la = ['bear', 'tiger', 'wolf', 'whale', 'elephant']
lb = ['swan', 'cat', 'dog', 'duck', 'rabbit']

modi(la, lb) # will modify the lists passed in.

print(la, lb) 

相关问题 更多 >