Nano Hash - криптовалюты, майнинг, программирование

В понимании списка Python можно ли получить доступ к индексу элемента?

Рассмотрим следующий код Python, с помощью которого я добавляю в новый list2 все элементы с индексами от 1 до 3 из list1:

for ind, obj in enumerate(list1):
    if 4 > ind > 0:
        list2.append(obj)

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

что-то типа:

list2 = [x for x in list1 if 4 > ind > 0]

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

list2 = [x for x in enumerate(list1) if 4 > ind > 0]

  • Я предполагаю, что ваш фактический вариант использования более сложен, но вы могли бы просто нарезать list1[1:4] здесь 14.02.2013
  • вы имеете в виду, как я мог бы нарезать список внутри понимания списка? как : [x for x in list1[1:4]] ? 14.02.2013
  • @PavAmetvic, нет @wim означает, что вы можете просто написать list2 = list1[1:4] 14.02.2013

Ответы:


1

Если вы используете enumerate, у вас есть доступ к индексу:

list2 = [x for ind, x in enumerate(list1) if 4>ind>0]
13.02.2013

2

Если ваш реальный вариант использования не является более сложным, вам следует просто использовать фрагмент списка, как это было предложено @wim.

>>> list1 = ['zero', 'one', 'two', 'three', 'four', 'five', 'six']
>>> [x for ind, x in enumerate(list1) if 4 > ind > 0]
['one', 'two', 'three']
>>> list1[1:4]
['one', 'two', 'three']

Для более сложных случаев - если вам на самом деле не нужен индекс - понятнее перебирать срез или islice.

list2 = [x*2 for x in list1[1:4]]

or

from itertools import islice
list2 = [x*2 for x in islice(list1, 1, 4)]

Для небольших фрагментов простой list1[1:4]. Если срезы могут стать довольно большими, может быть лучше использовать islice, чтобы избежать копирования памяти.

14.02.2013
  • спасибо, но поскольку я хочу выполнить операцию над «x» внутри понимания (скажем, x * x), прежде чем сохранить его в новом списке, похоже, что использование фрагмента внутри понимания списка — лучший способ! Благодарность 14.02.2013
  • @PavAmetvic, хорошо, эти случаи все еще достаточно просты, чтобы не нуждаться в перечислении 14.02.2013

  • 3

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

    Это можно сделать, как показано ниже:

    >>> values = ['zero', 'one', 'two', 'three', 'four', 'five', 'six']
    >>> search = ['one', 'three', 'five']
    >>> matches = [i for i, x in enumerate(values) if x in search]
    >>> print(matches)
    [1, 3, 5]
    

    Важной частью выше является использование шаблона [i for i, x in enumerate(l) if ...] в понимании списка, где фиксируется индекс i, а не значение x, которое было бы достигнуто с использованием более типичных [x for x in l if ...] или альтернативных шаблонов понимания списка перечисления [x for i, x in enumerate(l) if ...].

    15.06.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..