изменять списки, удаляя элементы без создания беспорядка

Я пытаюсь решить теперь задачу, которая звучит так:

'' напишите функцию modi (la, lb), которая принимает входные 2 списка la и lb, которые имеют одинаковое количество элементов внутри. Функция должна изменять списки элементов l и lb camparing с теми же индексами в двух списках и удалять более крупные, если элементы равны, функция удаляет оба из них. «»

  • Добавление элементов в список списков в python
  • Как рассчитать частоту элементов для парного сравнения списков в Python?
  • Почему преобразование списка в набор быстрее, чем просто список для вычисления разницы в списках?
  • Как отсортировать список словарей по значениям словаря в Python?
  • Определить, имеет ли список последовательные элементы, равные в python
  • Тестирование, если список содержит другой список с Python
  • Например:

    • la = ['медведь', 'тигр', 'волк', 'кит', 'слон']
    • lb = ['swan', 'cat', 'dog', 'duck', 'rabbit']

    Итак, functin должен вернуться: ['bear', 'elephant'] ['cat', 'dog', 'duck']

    Я написал следующий код, но он не изменяет списки, а создает новые и добавляет туда элементы. Некоторые идеи, как я могу это сделать?

    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 (), но создал большой беспорядок

  • Сортировка элементов словаря в списке
  • Недопустимый токен при использовании октальных чисел
  • Синтаксис фрагмента списка Python, используемый без видимой причины
  • Цепочка функций в Python
  • Выполнение `Exception .__ str __ ()` в Python
  • Как преобразовать список в строку
  • 6 Solutions collect form web for “изменять списки, удаляя элементы без создания беспорядка”

    Это решит вашу проблему. Я думаю, что это проще, чем все другие решения.

     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 

    Как правило, когда вы мутируете список, итерации по нему. Вместо этого рекомендуется перебирать копию. Ниже приведен пример того, что вы сделали бы, чтобы изменить один список.

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

    В вашем собственном коде la = latemp и lb = 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) 

    Вы должны использовать del чтобы удалить элемент списка. Также вы должны итерации от конца до начала, потому что если вы поедете с начала и удалите let say 1st element, элемент, который был на 3rd месте, теперь будет на 2nd

    Он должен выглядеть

     #you need to handle what if len of lists is 0, if lens are not the same and so on... def compare_and_delete(list1, list2): i = len(list1) -1 while i >= 0: if list1[i] > list2[i]: del list1[i] elif list2[i] > list1[i]: del list2[i] else: del list1[i] del list2[i] i-=1 return list1, list2 l1, l2 = compare_and_delete(['bear', 'tiger', 'wolf', 'whale', 'elephant'], ['swan', 'cat', 'dog', 'duck', 'rabbit']) - #you need to handle what if len of lists is 0, if lens are not the same and so on... def compare_and_delete(list1, list2): i = len(list1) -1 while i >= 0: if list1[i] > list2[i]: del list1[i] elif list2[i] > list1[i]: del list2[i] else: del list1[i] del list2[i] i-=1 return list1, list2 l1, l2 = compare_and_delete(['bear', 'tiger', 'wolf', 'whale', 'elephant'], ['swan', 'cat', 'dog', 'duck', 'rabbit']) 

    По сути, вам нужно отслеживать, сколько раз вы удаляли из каждого списка, и смещаете свою индексацию на эту сумму. Вот базовый подход:

     >>> a ['bear', 'tiger', 'wolf', 'whale', 'elephant'] >>> b ['swan', 'cat', 'dog', 'duck', 'rabbit'] >>> i = j = 0 >>> for k, (str1,str2) in enumerate(zip(a,b)): ... if len(str1) == len(str2): ... del a[ki], b[kj] ... i += 1 ... j += 1 ... elif len(str1) > len(str2): ... del a[ki] ... i += 1 ... else: ... del b[kj] ... j += 1 ... >>> a [] >>> b ['cat', 'dog', 'duck', 'rabbit'] >>> 

    Вы можете воспользоваться тем фактом, что присвоение срезу изменяет список:

     la[:] = latemp lb[:] = lbtemp 
    Python - лучший язык программирования в мире.