WedX - журнал о программировании и компьютерных науках

Удалить несколько элементов в списке по индексу в Python

Я хотел бы удалить несколько элементов в списке по их индексу:

dS = [0, 0.02, 0, 0.04, 0.07, 0]
dN = [1, 0.02, 0.3, 0.7, 0.9]
pos = [i for i, e in enumerate(dS) if e ==0]

И теперь я хотел бы удалить (в обоих списках) все элементы на позициях 0 в первом списке.

30.11.2018

  • на каком языке? 30.11.2018
  • Python, я отредактировал заголовок 30.11.2018
  • Не могли бы вы добавить некоторые данные? Ввод, вывод? 30.11.2018
  • См. предыдущий вопрос stackoverflow.com/questions/36268749/ 30.11.2018
  • Я бы изменил ваше понимание списка для генератора, вместо списка, для производительности pos = (i for i, e in enumerate(dS) if e ==0) и после, пробежался по списку и удалил каждое: for idx in pos[::-1]: del dS[idx] Видите ли, я перевернул список, чтобы не менять числа, которые будут удален 30.11.2018
  • что-то вроде [dN[i] for i, e in enumerate(dS) if e] 30.11.2018
  • @LuanNaufal Я сомневаюсь, что генератор улучшит производительность, я подозреваю, что на самом деле он хуже 30.11.2018
  • @juanpa.arrivillaga, с timeit оба варианта действительно имеют разную производительность, а с генератором он работает быстрее (хотя разница невелика): 0,12277622299734503 (со списком) 0,11267214198596776 (с генератором) 30.11.2018

Ответы:


1

Предполагая, что у вас есть old_list со списком индексов pos, от которых вы хотите избавиться:

new_list = [old_list[i] for i, e in enumerate(old_list) if i not in pos]

Это будет работать как для списка в вашем вопросе, избавившись от элемента в индексе, указанном pos, просто замените old_list именем списка, которое у вас есть в настоящее время:

dS = [0, 0.02, 0, 0.04, 0.07, 0]
dN = [1, 0.02, 0.3, 0.7, 0.9]
pos = [i for i, e in enumerate(dS) if e ==0]
dS = [dS[i] for i, e in enumerate(dS) if i not in pos]
dN = [dN[i] for i, e in enumerate(dN) if i not in pos]
>>> dS, dN
([0.02, 0.04, 0.07], [0.02, 0.7, 0.9])

Это отлично работает для списков разной длины, как показано в вашем случае выше.

30.11.2018
  • Это кажется мне самым питоническим. Это читабельно, и каждый список dS и dN не зависит друг от друга. 30.11.2018
  • pos, вероятно, должен быть set для более быстрого поиска 01.12.2018
  • Вы также можете использовать непосредственно переменную e и избавиться от поиска, как в dS = [e for i, e in enumerate(dS) if i not in pos] 01.12.2018
  • @RockyLi, сравнивая ваше решение с тем, что я предложил (этот: stackoverflow.com/a/53564806/10642035), ваш, поскольку вы создаете 2 новых списка для задачи, работает намного медленнее (в 2 раза медленнее). Используя timeit для сравнения обоих, здесь измерение с использованием 100000 прогонов: Мое - 0,15612420099205337 Ваше - 0,3033675350015983 01.12.2018

  • 2

    Я хотел бы удалить (в обоих списках) все элементы на позициях 0 в первом списке.

    Хорошо, сначала обработайте второй список, выбрав только элементы того же индекса, что и ненулевые элементы первого списка:

    dN = [dN[i] for i, e in enumerate(dS) if e]
    

    затем сделайте то же самое для dS (примечание: в этом случае вариант будет использовать filter):

    dS = list(filter(None,dS))
    
    30.11.2018
  • Это предполагает, что оба списка имеют одинаковую длину. Если dN больше, это решение урежет его элементы в конечном результате. 30.11.2018

  • 3

    У вас есть выбор: создать новые копии каждого списка, опустив некоторые элементы, или изменить оба списка на месте.

    dS = [0, 0.02, 0, 0.04, 0.07, 0]
    dN = [1, 0.02, 0.3, 0.7, 0.9]
    
    # make copies of both lists while omitting indices
    # that corresponds to zeros in dS
    dS, dN = map(list, zip(*[(s, n) for s, n in zip(dS, dN) if s != 0]))
    
    # alternatively, modify lists inplace
    dS = [0, 0.02, 0, 0.04, 0.07, 0]
    dN = [1, 0.02, 0.3, 0.7, 0.9]
    
    # process lists in reverse
    for i in range(1, len(dS)):
        try:
            if dS[-i] == 0:
                del dS[-i], dN[-i]
        except IndexError:
            break
    
    30.11.2018

    4

    Поскольку ваши списки имеют разную длину, вам нужно только пройти через свой список pos и удалить из обоих списков, например: (важно запускать в обратном порядке в pos, чтобы гарантировать, что вы не попытаетесь удалить индекс элемента, который не уже существует)

    for idx in pos[::-1]:
            del dS[idx]
            if idx < len(dN):
                del dN[idx]
    
    30.11.2018
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]