Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/40: Рейтинг темы: голосов - 40, средняя оценка - 4.65
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83

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

04.05.2017, 18:25. Показов 7970. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, дорогие форумчане!
Нужна Ваша помощь!

Проблема: дан массив вида:
Python
1
[['0', 'L', '-', '1', '0', 'R', '4'], ['0', 'L', '-', '1', '1', 'R', '-', '1'], ['0', 'R', '0', '1', 'R', '2'], ['0', 'L', '0', '0', 'L', '-', '1'], ['0', 'L', '4', '0', 'R', '3']]
.

Необходимо пройти по элементам элементов массива и если встречается "-", то удалить следующий за ним элемент.

На выходе должно получиться следующее:
Python
1
[['0', 'L', '-', '0', 'R', '4'], ['0', 'L', '-', '1', 'R', '-'], ['0', 'R', '0', '1', 'R', '2'], ['0', 'L', '0', '0', 'L', '-'], ['0', 'L', '4', '0', 'R', '3']]
.

Очень надеюсь на Вашу помощь!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.05.2017, 18:25
Ответы с готовыми решениями:

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

Удаление элементов списка по условию
Из списка чисел удалить элементы, значения которых больше 35 и меньше 65. При этом удаляемые числа сохранить в другом списке. A = B = ...

Удаление элемента, стоящего посередине списка (если длина списка нечетна)
Написать функцию, которая удаляет из списка элемент, стоящий в середине (удалённый от начала и конца списка на одинаковое количество...

18
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
04.05.2017, 18:40
Цитата Сообщение от alex9816 Посмотреть сообщение
Необходимо пройти по элементам элементов массива и если встречается "-", то удалить следующий за ним элемент.
В чем конкретно у тебя проблемы?
Цитата Сообщение от alex9816 Посмотреть сообщение
дан массив вида:
Это не массив, это список.
0
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
04.05.2017, 18:47  [ТС]
Да, извините, это список, я ошибся.

Проблема в следующем:
Вот мой код:

Python
1
2
3
4
5
6
        for elements in mas:
            for number1 in range(5):
                for number in range(len(elements)):
                    if mas[number1][number] == "-":
                        number += 1
                        mas[number1][number].pop(number)
Выводится ошибка:

mas[number1][number].pop(number)
AttributeError: 'str' object has no attribute 'pop'
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.05.2017, 19:02
Python
1
2
3
4
5
6
7
8
9
10
lst = [['0', 'L', '-', '1', '0', 'R', '4'], ['0', 'L', '-', '1', '1', 'R', '-', '1'], ['0', 'R', '0', '1', 'R', '2'], ['0', 'L', '0', '0', 'L', '-', '1'], ['0', 'L', '4', '0', 'R', '3']]
for l in lst:
    if '-' in l:
        try:
            idx = l.index('-')
            del l[idx+1]
        except:
            pass
print(lst==[['0', 'L', '-', '0', 'R', '4'], ['0', 'L', '-', '1', 'R', '-', '1'], ['0', 'R', '0', '1', 'R', '2'], ['0', 'L', '0', '0', 'L', '-'], ['0', 'L', '4', '0', 'R', '3']]) 
>>True
0
 Аватар для Semen-Semenich
5220 / 3468 / 1172
Регистрация: 21.03.2016
Сообщений: 8,291
04.05.2017, 19:10
Garry Galler, не сработает если в l будет два и более дефиса смотри внимательно свое решение второй злемент
было
Python
1
['0', 'L', '-', '1', '1', 'R', '-', '1']
стало
Python
1
['0', 'L', '-', '1', 'R', '-', '1']
как видишь после второго - осталась 1
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.05.2017, 19:16
Semen-Semenich,
Тут, согласен. Но ТС привел конечный вид массива - он совпал с тем, что делает скрипт. Если ТС решит, что ему на самом деле нужно проверять все дефисы - тогда нужен будет другой вариант.

Добавлено через 2 минуты
А понял - я не тот вариант подставил для сравнения. Поэтому у меня и совпало :-)
Тогда да - это не годится.
0
 Аватар для Semen-Semenich
5220 / 3468 / 1172
Регистрация: 21.03.2016
Сообщений: 8,291
04.05.2017, 19:17
Лучший ответ Сообщение было отмечено alex9816 как решение

Решение

Python
1
2
3
4
5
6
7
8
lst = [['0', 'L', '-', '1', '0', 'R','-', '4'], ['0', 'L', '-', '1', '1', 'R', '-', '1'], ['0', 'R', '0', '1', 'R', '2'], ['0', 'L', '0', '0', 'L', '-', '1'], ['0', 'L', '4', '0', 'R', '3','-']]
 
for l in lst:
    for x in reversed(range(len(l))):
        if l[x] == '-' and x+1 != len(l):
            del l[x+1]
 
print(lst)
1
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
04.05.2017, 19:24  [ТС]
Да, нужны все "-", простите, не уточнил.

Добавлено через 4 минуты
Semen-Semenich, огромное спасибо!!! Просто спасли!
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.05.2017, 19:28
Ну и я докину раз уж начал:
Python
1
2
3
4
5
6
7
for l in lst:
    idx_lst = [idx for idx,val in enumerate(l) if val == '-']
    for idx in idx_lst[::-1]:
        try:
            del l[idx+1]
        except:
            pass
1
 Аватар для Semen-Semenich
5220 / 3468 / 1172
Регистрация: 21.03.2016
Сообщений: 8,291
04.05.2017, 19:38
Garry Galler, опять не учел что после удаления элемента индексы сдвигаются плэтому у тебя происходит удаление двух элементов
исходный
Python
1
[['0', 'L', '-', '1', '0', 'R','-', '4'], ['0', 'L', '-', '1', '1', 'R', '-', '1']]
как должно получиться
Python
1
[['0', 'L', '-', '0', 'R', '-'], ['0', 'L', '-', '1', 'R', '-']]
и как у тебя выдало
Python
1
[['0', 'L', '-', 'R', '-'], ['0', 'L', '-', 'R', '-']]
в первом списке удален 0 во втором вторая 1
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.05.2017, 19:55
Semen-Semenich,
Где выдало?
Вот, например, исходный:
Python
1
[['0', 'L', '-', '1', '0', 'R','-', '4'], ['0', 'L', '-', '1', '1', 'R', '-', '1']]
Вот на выходе:
Python
1
[['0', 'L', '-', '0', 'R', '-'], ['0', 'L', '-', '1', 'R', '-']]
Добавлено через 1 минуту
Как и должно быть. Итерация же с конца - так же как в вашем варианте с reverse. Индексы не сдвигаются.

Добавлено через 6 минут
Скрин прикладывать :-)?
1
 Аватар для Semen-Semenich
5220 / 3468 / 1172
Регистрация: 21.03.2016
Сообщений: 8,291
04.05.2017, 19:57
Garry Galler, пардон мой косяк я твой код дописал после своего и когда мой изменил массив потом твой продолжил менять а я тупо сравнил ответы
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.05.2017, 21:28
Ясно. А я уж думал, что у меня интерпретатор заинтерпретировался :-)

Добавлено через 1 час 26 минут
Для коллекции ТС'у еще и oneliner:
Python
1
2
lst = [[val for idx,val in enumerate(l) if l[idx - 1] != '-'] for l in lst]  
print(lst)
Тут, конечно, новый список формируется (следовательно расход доп. памяти), зато кратко - почти как Perl :-)
0
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
04.05.2017, 21:37  [ТС]
Garry Galler, спасибо огромное!!!

У меня другая проблема возникла.
Ошибка:
ValueError: invalid literal for int() with base 10: '-'

Это я работаю все с тем же списком. Причём моя программа то нормально работает, то выдаёт ошибку. К сожалению код предоставить не могу, так как эта программа содержит в себе более 500 строк и использует в себе аналогичную программу. Могу выложить функцию, в которой возникает эта проблема, надеюсь этого будет достаточно)

Функция, в которой возникает ошибка:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    def step(self, instruction, silent, check):
        """
        Execute one step of the Turing machine.
 
        """
 
        number_of_step = 1
        i = 1
        direction_for_print = "L"
        next_state = instruction[0][0][2]
        write_state = instruction[0][0][0]
 
        index = len(Turing_tape)/2
        number_instruction = 0
 
        while number_instruction != "-":
 
            if silent == "false\n":
                self.print_contents(number_of_step, write_state,
                direction_for_print, next_state)
 
            if i == check:
                i = 0
                print '\n\n'
                self.print_contents(number_of_step, write_state,
                direction_for_print, next_state)
                self.print_tape(Turing_tape)
                print '\n\n'
 
            if number_of_step > 11000000:
                break
 
            if Turing_tape[index] == "0":
                tape = instruction[int(number_instruction)][0][0]
                Turing_tape[index] = tape
                direction = instruction[int(number_instruction)][0][1]
                if direction == "R":
                    index += 1
                if direction == "L":
                    index -= 1
                number_instruction = instruction[int(number_instruction)][0][2]
                number_of_step += 1
                i += 1
                direction_for_print = direction
                next_state = number_instruction
                write_state = tape
 
            if Turing_tape[index] == "1":
                tape = instruction[int(number_instruction)][1][0]
                Turing_tape[index] = tape
                direction = instruction[int(number_instruction)][1][1]
                if direction == "R":
                    index += 1
                if direction == "L":
                    index -= 1
                number_instruction = instruction[int(number_instruction)][1][2]
                number_of_step += 1
                i += 1
                direction_for_print = direction
                next_state = number_instruction
                write_state = tape
 
        return Turing_tape
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.05.2017, 22:03
У вас код пытается преобразовать в int все без разбору (например, дефис: with base 10: '-'). Нужно предварительно проверять "число ли эта строка".isdigit() и только потом преобразовывать в int. Либо использовать try: except там, где идет преобразование.

Добавлено через 2 минуты
Проверка while number_instruction != "-": вас не спасает, потому что number_instruction может быть присвоено значение в виде дефиса уже внутри кода, где у вас идет кастование в int.

Добавлено через 3 минуты
Например, в строке 41.

Добавлено через 29 секунд
А ниже - опять каст в int. И никакой проверки.
0
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
04.05.2017, 22:09  [ТС]
По алгоритму в принципе не может записываться в эту переменную дефис "-". Потому что не должно осуществляться никакой записи, так как если встречается "-", то функция должна немедленно завершаться. По крайней мере так задумано, но возможно реализовано не правильно. Поэтому вопрос, прав ли я, что действительно не должно производиться записи? Если нет, то почему? И если нет, то как мне применить функцию isdigit(), чтобы при встрече "-" цикл сразу заканчивался и не производил запись "-" в переменную?

Добавлено через 58 секунд
А, то есть такая проверка не годится. Понял. Тогда как мне быть с isdigit()?

Добавлено через 3 минуты
Только почему ругается такой ошибкой на эту строку:
Python
1
    tape = instruction[int(number_instruction)][1][0]
, когда запись производится в этой:
Python
1
number_instruction = instruction[int(number_instruction)][1][2]
?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.05.2017, 22:19
Почему так - честно, не знаю. Тут какой-то подводный камень есть.
Но лучше просто проверять каждый раз перед передачей int'у значение, что вы даете ему точно число.
0
0 / 0 / 1
Регистрация: 26.03.2017
Сообщений: 83
05.05.2017, 09:24  [ТС]
По поводу кастования в int. Теоретически оно и не нужно, но практически иначе. Если убрать, то выдается следующая ошибка:

Python
1
2
    number_instruction = instruction[number_instruction][0][2]
TypeError: list indices must be integers, not str
int я убрал в строке, в которой по логике должна производиться перезапись "-", а не в той, которая выдается в ошибке по факту.

Добавлено через 44 секунды
Проверять не получится, так как я не могу обратиться к элементу без этого int.

Добавлено через 8 минут
Собственно, вот:
Python
1
2
    if instruction[number_instruction][1][2].isdigit():
TypeError: list indices must be integers, not str
Добавлено через 1 час 15 минут
Постарался исправить, сделал по Вашему совету, вроде ошибка исчезла. Протестировал раз 10.

Собственно, сам код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
def step(self, instruction, silent, check):
        """
        Execute one step of the Turing machine.
 
        """
 
        number_of_step = 1
        i = 1
        direction_for_print = "L"
        next_state = instruction[0][0][2]
        write_state = instruction[0][0][0]
 
        index = len(Turing_tape)/2
        number_instruction = '0'
 
        while number_instruction != "-":
 
            if silent == "false\n":
                self.print_contents(number_of_step, write_state,
                direction_for_print, next_state)
 
            if i == check:
                i = 0
                print '\n\n'
                self.print_contents(number_of_step, write_state,
                direction_for_print, next_state)
                self.print_tape(Turing_tape)
                print '\n\n'
 
            if number_of_step > 11000000:
                break
 
            if index < 0 or index > len(Turing_tape):
                break
 
            if Turing_tape[index] == "0":
                if number_instruction.isdigit():
                    tape = instruction[int(number_instruction)][0][0]
                    Turing_tape[index] = tape
                    direction = instruction[int(number_instruction)][0][1]
                    if direction == "R":
                        index += 1
                    if direction == "L":
                        index -= 1
                    number_instruction = instruction[int(number_instruction)][0][2]
                    number_of_step += 1
                    i += 1
                    direction_for_print = direction
                    next_state = number_instruction
                    write_state = tape
                else:
                    break
 
            if Turing_tape[index] == "1":
                if number_instruction.isdigit():
                    tape = instruction[int(number_instruction)][1][0]
                    Turing_tape[index] = tape
                    direction = instruction[int(number_instruction)][1][1]
                    if direction == "R":
                        index += 1
                    if direction == "L":
                        index -= 1
                        number_instruction = instruction[int(number_instruction)][1][2]
                    number_of_step += 1
                    i += 1
                    direction_for_print = direction
                    next_state = number_instruction
                    write_state = tape
                else:
                    break
 
 
        return Turing_tape
Единственное, неправильно работает ограничение с правой стороны:
Python
1
2
            if index < 0 or index > len(Turing_tape):
                break
Добавлено через 9 часов 34 минуты
Проблему с ограничением правой стороны решил.

Добавлено через 2 минуты
Просто недоглядел

Решение:

Python
1
2
       if index < 0 or index > len(Turing_tape)/2:
                break

Большое спасибо за помощь!!!
0
Эксперт Python
 Аватар для dondublon
4648 / 2068 / 366
Регистрация: 17.03.2012
Сообщений: 10,169
Записей в блоге: 6
05.05.2017, 18:15
Я бы сделал так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
from itertools import tee
 
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)
 
def remove_after_minus(lst):
    return [i[1] for i in pairwise(lst) if i[0]!='-']
 
lst = ['0', 'L', '-', '1', '0', 'R', '4']
print (remove_after_minus(lst))
Функция pairwise - из готовых рецептов отсюда https://docs.python.org/3/library/itertools.html . В принципе, всё то же самое, но больший уровень абстракции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.05.2017, 18:15
Помогаю со студенческими работами здесь

удаление из списка элемента и редактирование списка!!!Решаемо но не для моего глупого мозга
Ребята вот што у меня есть попробуйте из этого што нить сварганить плиз срочно!!!! program spisok; uses crt; type...

Удаление из списка строк, не удовлетворяющих условию
Напишите функцию remove_inappropriate(spells), принимающую единственный параметр - список строк. Функция должна удалять из этого списка...

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

Удаление элемента списка/вывод нового списка
В общем, в 3м массиве у меня по идее должен был собраться новый список но выводится он чего-то не хочет по нормальному. А во 2м пытаюсь...

Реализация списка.Удаление хвостового элемента.Поиск элемента
Всем привет,мое задание выглядит так : В класс List&lt;T&gt; из классной работы добавить следующие методы: void addHead(T...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru