0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127

Заменить значения в списке

16.12.2019, 11:53. Показов 5047. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть массив значений (это может быть любой формат, список, тупл..)
Например такой массив [0,0,0,5,0,0,7,0,0,0,0,11,0,0,0,3,0,0,0]
В этом списке есть или нули и значения. Есть ли способ без цикла перенести значения на один шаг назад, заменив предыдущие значения? Нули остаются на своих местах.
Должно получится такое [0,0,0,7,0,0,11,0,0,0,0,3,0,0,0,0,0,0,0] Последнее значение заменяется нулем.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.12.2019, 11:53
Ответы с готовыми решениями:

Заменить значения в списке по шаблону
У меня есть три списка. Все списки имеют одинаковую длину. Первый список это значения от 0 до 1 (рандомные значения). Второй и третий...

Как заменить значения ключей в списке со словарями?
В примере все просто. my_dict = { 'foo': 42, 'bar': 12.5 } my_dict = "Hello" но тут список со словарями с...

Как найти в списке значения, которая есть в предыдущем списке
Добрый день ! Как найти в списке значения, которая есть в предыдущем списке в python Спасибо за внимания

11
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
16.12.2019, 12:29
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def lshift(lst,vals,pl,pv):
    if pl==len(lst):
        return []
    elif lst[pl]==0:
        return [0]+lshift(lst,vals,pl+1,pv)
    elif pv>=len(vals):
        return [0]+lshift(lst,vals,pl+1,pv)
    else:
        return [vals[pv]]+lshift(lst,vals,pl+1,pv+1)
 
def task(lst):
    zz=list(filter(lambda x: x!=0,lst))
    return lshift(lst,zz[1:],0,0)
 
print(task( [0,0,0,5,0,0,7,0,0,0,0,11,0,0,0,3,0,0,0]))
1
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
20.12.2019, 11:51  [ТС]
В принципе код работает хорошо на малых данных (более 3000), но при увеличении данных возникает ошибка:
maximum recursion depth exceeded while calling a Python object
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
20.12.2019, 12:40
Лучший ответ Сообщение было отмечено slavavs как решение

Решение

Чем вам цикл не угодил?

Упс… получился сдвиг вправо:
Python
1
2
3
4
5
6
7
8
9
10
11
ls =  [0,0,0,5,0,0,7,0,0,0,0,11,0,0,0,3,0,0,0]
 
def magic(i):
    if i == 0:
        return 0
    r = magic._
    magic._ = i
    return r
magic._ = 0
 
print(list(map(magic, ls)))
Добавлено через 3 минуты
Знаете анекдот?
как программист кипятит воду в чайнике?
1. Набирает воду в чайник
2. Ставит чайник на огонь
3. Ждет пока тот не вскипит

как программист кипятит воду в чайнике если в нем уже есть вода?
1. Выливает воду из чайника что сводит задачу к уже решенной
Так вот:
Python
1
print(list(reversed(list(map(magic, reversed(ls))))))
1
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
15.01.2020, 17:14  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Так вот:
Код твой прекрасно работает, хотя я сколько не пытался понять как работает функция magic (если кто подскажет буду благодарен).
Теперь задача немного изменилась.
Раньше был один список, теперь их пришлось сделать два, так как не везде нули, и передвигать стало невозможно без второго списка меток.
Итак первый список ls1 = [0,0,0,5,-1,3,7,-1,-2,2,0,11,-1,-2,0,3,-1,-2,0]
Второй ls2 = [0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0]

Второй список говорит какие позиции в первом нужно передвинуть (там где 1 во втором)?

Можно такое замутить по принципу функции magic, работает она прекрасно на больших данных.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
15.01.2020, 17:24
Возьми цикл и не страдай фигнёй:
Python
1
2
3
4
5
6
7
8
9
def magic2(i):
    if i[1] == 0:
        return i[0]
    r = magic2._
    magic2._ = i[0]
    return r
magic2._ = 0
 
print(list(map(magic2, zip(ls1,ls2))))
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
15.01.2020, 17:55  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Возьми цикл и не страдай фигнёй:
Можно и цикл, лишь бы работало.
Код ваш в другую сторону сдвигает, реверс надо как-то прикрутить
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
15.01.2020, 17:59
Цикл и сам можешь написать. Реверс уже был.
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
15.01.2020, 18:00  [ТС]
Python
1
print(list(reversed(list(map(magic2, zip(reversed(ls1),reversed(ls2)))))))
работает.
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
23.01.2020, 14:02  [ТС]
Привет Лис.
Подскажи, как изменить функцию magic2, если на вход подается не два списка как я ранее писал, а один, но там вложенные кортежи.
[(0, 0), (0, 0), (0, 0), (2.5, 1), (0, 0), (1.5, 1), (-1.5, 1), (0.5, 1), (0.5, 1), (0.5, 1), (0, 0)]

Добавлено через 3 минуты
извини, разобрался)))
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
04.02.2020, 14:15  [ТС]
Вопрос на эту же тему, поэтому новую думаю нет смысла создавать.
Есть список [0.0, 0.0, 0.0, 0.0, -5.0, 0.0, 0.0, 1.0, -2.0, 0.0, 0.0, 0.0, 3.0, 0.0, 0.0]
Как заменить нули на значение, которое начинается после нулей?
Нужно получить
[-5.0, -5.0, -5.0, -5.0, -5.0, 1.0, 1.0, 1.0, -2.0, 3.0, 3.0, 3.0, 3.0, 0.0, 0.0]

Добавлено через 1 час 5 минут
Сделал такую дичь, выглядит стремно, но работает

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def foo(ls):
    s = []
    s_all = []
    for i1 in range(len(ls)):
        if ls[i1]==0.:
            s.append(0.)
        else:
            if s:
                for i2 in range(len(s)+1):
                    s_all.append(ls[i1])
                s=[]
            else:
                s_all.append(ls[i1])
    if s:
        for i2 in range(len(s)):
            s_all.append(ls[i1])
    return s_all
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
04.02.2020, 14:52
Python
1
2
3
4
5
6
a = [0.0, 0.0, 0.0, 0.0, -5.0, 0.0, 0.0,
     1.0, -2.0, 0.0, 0.0, 0.0, 3.0, 0.0, 0.0]
for i in range(len(a)-2, -1, -1):
    if a[i] == 0:
        a[i] = a[i+1]
print(a)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2020, 14:52
Помогаю со студенческими работами здесь

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

При поиске значения в списке, не находит двухзначные значения
Вопрос собственно вот в чём: При поиске значения в списке в переменной t_list - однозначное значение находит исправно, но если...

В списке L1 найти элементы, имеющиеся в списке L2 и заменить их на элементы из списка L3
В списке L1 найти элементы, имеющиеся в списке L2 и заменить их на элементы из списка L3. Заранее спасибо.

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

Если значения a,b не принадлежат интервалу [0,1] , то заменить значения на соответствующие ближайшие граничные значения
Вычислить значения следующих выражений для заданных пользователем значений параметров a, b , с условием: если значения a,b не принадлежат...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru