Python: замена отрицательных чисел в данном списке на строку

Учитывая список чисел, замените любое отрицательное число строкой «neg». [1,2-3,4-5,6 ] => [1,2,"-отрицательный",4,"-отрицательный",6]

def swapToNeg(lis):
    for i in lis:
        if (i < 0):
            lis[i] = "neg"
    print(lis)

Я продолжаю сталкиваться с двумя типами ошибок, которые я не могу понять. --> 1 - IndexError: индекс назначения списка вне допустимого диапазона --> 2 - TypeError: '<' не поддерживается между экземплярами 'str' и 'int'

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

for i in lis перебирает элементы в списке, а не их индексы.
ndc85430 08.07.2023 06:18

Ваш первоначальный список состоит из 4 пунктов: 1, (2-3), (4-5) и 6. Ваш желаемый результат состоит из 6 пунктов. Поскольку математические операции оцениваются python (2-3)=-1, мы не сможем определить, содержит ли термин отрицательное вычитаемое. Таким образом, ваш желаемый результат может быть максимум [1, "-neg", "-neg", 6]

destructioneer 08.07.2023 06:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы пытаетесь использовать i как индекс списка, так и значение этого индекса в списке. Для цикла for, который вы создали, просто перебирает значения, а не инкрементные индексы.

Вы, вероятно, хотите что-то подобное, когда вы перебираете значения индекса. Вы можете использовать оператор range для перечисления из 0..len(lis)-1

def swapToNeg(lis):
    list_length = len(lis)   
    for i in range(list_length):
        if (lis[i] < 0):
            lis[i] = "neg"
    print(lis)

Спасибо за такой быстрый ответ на такой простой вопрос, лол. Я знал! что метод len() должен был вызываться таким образом, чтобы попытаться сравнить фактическое значение.

A.Ozone 08.07.2023 07:12

Или вы можете перестроить список: lis = [i if i >= 0 else '-neg' for i in lis]

Matthias 08.07.2023 11:09

Вы неправильно получаете доступ к списку этот код работает

lis=[1,-2,3]
for i in lis:
  if i<0:
    lis[lis.index(i)]='neg'

Как работает этот код, если в списке есть другие отрицательные значения, отличные от -2.

selbie 08.07.2023 06:22

Это работает только тогда, когда вы знаете, что ваше единственное отрицательное число равно -2.

destructioneer 08.07.2023 06:26

Теперь у вас есть итерация по элементам в списке. i устанавливается равным 1, 2-3, 4-5 и т. д. Вы получаете TypeError, потому что, когда i = 2-3, вы меняете 6 на строку "neg". затем, когда i = 4-5, снова осуществляется доступ к последнему элементу списка, но теперь i[-1] = "neg". поскольку «neg» — это строка, ее нельзя сравнивать с целым числом. есть несколько способов обновить вашу функцию:

  1. вы можете использовать range, чтобы i представлял индекс каждого элемента. i начинается с 0 и увеличивается на 1 до тех пор, пока не достигнет длины списка. в цикле for вам нужно будет получить доступ к lis[i], а не просто i.
def swapToNeg(lis):
    for i in range(len(lis)):
        if (lis[i] < 0):
            lis[i] = "neg"
    print(lis)
  1. вы можете комбинировать цикл по элементам и использовать индексы, используя enumerate. см. документацию здесь. в приведенном ниже примере el сохранит зацикленный элемент (1,2-3,4-5...), а i сохранит индекс зацикленного элемента (0,1,2...).
def swapToNeg(lis):
    for el, i in enumerate(lis):
        if (el < 0):
            lis[i] = "neg"
    print(lis)

Другие вопросы по теме