Вложенные списки - удалить данный элемент из вложенных списков - PullRequest
0 голосов
/ 19 сентября 2019

У нас есть следующий список для ввода:

[[-5, -1], [1, -5], [5, -1]]

Я создал функцию, которая принимает clist в качестве списка и number случайное число, которое я хочу удалить из списка.

Функция должна удалить все вложенные списки, содержащие данный number, и удалить отрицательный number во вложенном списке

def reduce(self, clist, number):
    self.temp = list(clist)

    # remove the nested list that contain the given number
    for item in clist:
        if number in item:
            self.temp.remove(item)

    # remove the negative number within the nested list
    for obj in self.temp:
        try:
            obj.remove(-number)
        except:
            pass

    return self.temp

Давайте выберем 1 как number и запустите код.

  • Первый цикл for удалит все вложенные списки, содержащие данное число, и получит следующее:

    self.temp = [[-5, -1], [5, -1]]

    clist = [[-5, -1], [1, -5], [5, -1]]

  • Второй цикл for должен удалить все отрицательные number во вложенных списках, но мы получаем следующее:

    self.temp = [[-5], [5]]

    clist = [[-5], [1, -5], [5]]

Чего я не понимаю, так это то, почему clist затрагивается, когда я работаю над вторым for цикл, особенно когда я работаю над списком self.temp?Это должно быть без ссылки на оригинальный список, но я что-то упустил.Помогите?

1 Ответ

1 голос
/ 19 сентября 2019

Похоже, что понимание вложенного списка было бы самым простым:

def reduce(clist, number):
    return [[x for x in subl if x != -number] for subl in clist if number not in subl]

print(reduce([[-5, -1], [1, -5], [5, -1]], 1))
# [[-5], [5]]

Это повторяет дважды по спискам, которые не содержат number, так что будет немного более эффективное решение, хотя реальная скорость будет зависетьна ваших данных.

def reduce(clist, number):
    result = []
    for subl in clist:
        temp = []
        for x in subl:
            if x == number:
                break
            elif x != -number:
                temp.append(x)
        else:
            result.append(temp)  # Only happens if there was no break
    return result

Вы можете сохранить этот результат в self.temp, если хотите (после добавления self обратно к параметрам), но мне не было ясно, действительно ли вы намеревались сохранить результатк объекту или нет.

...