Как заменить значение элемента в списке?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как заменить значение элемента в списке?

Как заменить значение элемента в списке?

Ответ
Поиск в этой теме
Непрочитано 15.11.2015, 12:41 #1
Как заменить значение элемента в списке?
vladimirr_b
 
Регистрация: 24.01.2012
Сообщений: 84

Здравствуйте! в списке (1 2 3) нужно заменить 3 на 10, т.е. результат должен быть (1 2 10). Какой функцией это можно сделать?
Просмотров: 7807
 
Непрочитано 15.11.2015, 12:59
1 | #2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


В списке невозможно заменить элемент - никак - можно создать новый измененный список (ну и как вариант сохранить его под тем-же именем - но это отдельная тема). Сделать это можно например
Код:
[Выделить все]
 (subst 10 3 '(1 2 3))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 15.11.2015, 13:42
#3
vladimirr_b


 
Регистрация: 24.01.2012
Сообщений: 84


а по номеру элемента никак??
vladimirr_b вне форума  
 
Непрочитано 15.11.2015, 15:11
1 | #4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от vladimirr_b Посмотреть сообщение
а по номеру элемента никак??
Код:
[Выделить все]
 (defun exclude (lst i)
  (if (zerop i)
	(cdr lst)
	(cons (car lst) (exclude (cdr lst) (1- i)))
  )
)

(defun include (lst i n)
  (if (zerop i)
	(cons n lst)
	(cons (car lst) (include (cdr lst) (1- i) n))
  )
)

(defun substitute (lst i n)
  (if (zerop i)
	(cons n (cdr lst)) 
	(cons (car lst) (substitute (cdr lst) (1- i) n))
  )
)
gomer вне форума  
 
Непрочитано 15.11.2015, 18:51
#5
Иванов Дмитрий


 
Регистрация: 28.09.2010
Сообщений: 55


Кривизна это все! Действительно ,напрямую нельзя заменить элемент списка по номеру. Autolist позорище!!! В нем вообще нет массивов как таковых. Жалею что очень зря когда-то начал изучать этот недоязык. Надо было на Си, ++, #, VB, не важно, но только не на этом самогонном агрегате
Иванов Дмитрий вне форума  
 
Непрочитано 15.11.2015, 21:17
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Иванов Дмитрий Посмотреть сообщение
Autolist позорище!!!
А что такое AutoList
Offtop: Дмитрий - а может просто не осилил...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 15.11.2015, 22:35
1 | #7
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Еще варианты
Код:
[Выделить все]
   (defun subst-i (i itm lst)
;;;================================================================================
;;;Ф-ция изменяет i-й(начиная с 0) элемент списка новым значением
;;; i - индекс элемента
;;;itm - новое значение
;;;lst - список
;;;http://www.theswamp.org/index.php?topic=14170.0
      (setq i (1+ i))
      (mapcar
        '(lambda (x)
           (if (zerop (setq i (1- i)))
             itm
             x
           ) ;_ end of if
         ) ;_ end of lambda
        lst
      ) ;_ end of mapcar
    ) ;_ end of defun
    (defun remove-i (i lst)
;;;Ф-ция удаляет i-й(начиная с 0) элемент списка
;;; i - индекс элемента
;;;lst- список
      (setq i (1+ i))
      (vl-remove-if '(lambda (x) (zerop (setq i (1- i)))) lst)
    ) ;_ end of defun
    (defun Insert-i (pos item lst / tmp)
;;;Ф-ция вставляет в позицию pos (начиная с 0) элемент списка item
;;; pos - индекс (позиция) начиная с 0
;;;; item - элемент списка
;;;  lst- список
;_http://www.theswamp.org/index.php?topic=14226.0
       (if (< -1 pos (1+ (length lst)))
        (progn
          (repeat pos
            (setq tmp (cons (car lst) tmp)
                  lst (cdr lst)
            )   ;_setq
          )     ;_repeat
          (append (reverse tmp) (list item) lst)
        )    ;_progn
        lst
      )   ;_if
    ) ;_defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 15.11.2015, 23:02
#8
Иванов Дмитрий


 
Регистрация: 28.09.2010
Сообщений: 55


меня всегда раздражала функция subst. Она заменяла элемент по значению, но при этом все! элементы из списка с указанным значением. Ладно бы, если только первый найденный элемент с указанным значением.
Здесь наверное такая логика у разработчиков. Списки, это не для списков чисел int или double. Это для примитивов. А примитивы не могут быть одинаковыми по определению, так как у них есть уникальные идентификационные метки что ли. И если функцией subst перекидывать примитивы в списке примитивов, то таких накладок как с числами (или строками) не будет. А то ой! функция заменила не только то, что нужно, но и то, чего совсем не надо было заменять.

не, ну конечно можно городить такое громодье (к VVA и остальным обращаюсь), но по-моему это не совсем тот инструмент. Не для чисел точно.

Последний раз редактировалось Иванов Дмитрий, 15.11.2015 в 23:05. Причина: дополнение
Иванов Дмитрий вне форума  
 
Непрочитано 15.11.2015, 23:43
1 | #9
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Если интересуют причины - могу пояснить - в структуре списка не подразумевается такой сущности как порядковый номер т.к. на любой список может ссылаться другая "голова" (cons x ...) - которая будет представлять из себя как-бы новый независимый список, по той-же причине он не изменяем. Все приведенные выше функции действительно являются "мракобесием", но не по причине, что в лиспе это не реализовано, а наоборот, когда пытаются зубы через ж..у лечить - получается вот такая кривизна. Лисп язык функциональный - соответственно и подразумевает работу с функциональными структурами данных (про то, что в автолиспе они не шибко на уровне реализованы - это да) - Вы на трамвае руль видели? И чего его там никто поставить не догадался? Им же без руля даже с рельс не съехать - чего Вы чертежи для поворота трамвайных колес не предлагаете.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 16.11.2015, 00:23
#10
Иванов Дмитрий


 
Регистрация: 28.09.2010
Сообщений: 55


Димон_, ну в общем если говорить абстракциями, то писать код на решение системы линейных алгебраических уравнений на АВТОЛИСПЕ это и есть разработка трамвайного руля.
Или так: Автолисп - средство для оперирования примитивами Автокада. Можно повесить в рамке в кабинете труда.
Иванов Дмитрий вне форума  
 
Непрочитано 16.11.2015, 01:20
#11
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Иванов Дмитрий Посмотреть сообщение
Димон_, ну в общем если говорить абстракциями, то писать код на решение системы линейных алгебраических уравнений на АВТОЛИСПЕ это и есть разработка трамвайного руля.
А по сравнению с чем? Если с вышеприведенными с(++,#), vb - я у последних вижу преимущество только в присутствии уже готовых библиотек "из коробки", если-же мы подберем задачу, где коробочный функционал одинаковый (как вариант - у обоих нет) - сильно не уверен - что выиграют по написанию кода - по скорости да, но будет-ли практическая разница.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 16.11.2015, 01:49
#12
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Иванов Дмитрий Посмотреть сообщение
Димон_, ну в общем если говорить абстракциями, то писать код на решение системы линейных алгебраических уравнений на АВТОЛИСПЕ это и есть разработка трамвайного руля.
Или так: Автолисп - средство для оперирования примитивами Автокада. Можно повесить в рамке в кабинете труда.
из попыток писать на лиспе у меня сложилось впечатление - что лисп заточен под потоковую обработку информации.. поэтому нет привычных массивов, коллекций, явного возврата значений из функции и т.п. И сравнивать лисп с "обычными" языками программирования просто бессмысленно.
Сергей812 вне форума  
 
Непрочитано 16.11.2015, 02:11
#13
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Offtop: Подозреваю, что если бы в своё время к AutoCAD'у не добавили AutoLisp, а добавили например C/C++, то количество тех, кто писал бы под AutoCAD уменьшилось бы в разы, если не в десятки раз. Показательно, что тех кто пишет с использованием ObjectARX (т.е. на C++) можно пересчитать по пальцам.
Александр Ривилис вне форума  
 
Непрочитано 16.11.2015, 02:18
#14
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Показательно, что тех кто пишет с использованием ObjectARX (т.е. на C++) можно пересчитать по пальцам.
... и те только потому, что есть функционал который не реализован через другие программные интерфейсы...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 16.11.2015, 02:35
#15
miko2009

Инженер-конструктор
 
Регистрация: 13.10.2011
Москва
Сообщений: 2,359


Цитата:
Сообщение от vladimirr_b Посмотреть сообщение
Здравствуйте! в списке (1 2 3) нужно заменить 3 на 10, т.е. результат должен быть (1 2 10). Какой функцией это можно сделать?
Код:
[Выделить все]
 
list=[1,2,3]
list[2]=10
Python я смотрю самый сложный из всех

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Иванов Дмитрий Посмотреть сообщение
Кривизна это все! Действительно ,напрямую нельзя заменить элемент списка по номеру. Autolist позорище!!! В нем вообще нет массивов как таковых. Жалею что очень зря когда-то начал изучать этот недоязык. Надо было на Си, ++, #, VB, не важно, но только не на этом самогонном агрегате
по моему ничего страшного нету переучиться , пару месяцев......
miko2009 вне форума  
 
Непрочитано 16.11.2015, 06:35
#16
Chardash

Соискатель
 
Регистрация: 12.03.2011
Урал
Сообщений: 1,496


для Qt:
Код:
[Выделить все]
 
#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QList <int> yourList;
    yourList << 1 << 2 << 3;
    yourList.replace(2, 10);
    qDebug() << "new List: " << yourList;
    return a.exec();
}

----- добавлено через ~2 мин. -----
для VS 2015
Код:
[Выделить все]
 
// ConsoleApplication4.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>  
#include <algorithm>   
#include <vector>       

using namespace std;

int main() {
	int yourList[] = { 1, 2, 3 };
	vector<int> replaceItem(yourList, yourList + 3);

	replace(replaceItem.begin(), replaceItem.end(), 3, 10);

	cout << "newYourList list:";
	for (vector<int>::iterator val = replaceItem.begin(); val != replaceItem.end(); ++val)
		cout << ' ' << *val;
	cout << '\n';

	getchar();
	return 0;
}

Chardash вне форума  
 
Непрочитано 16.11.2015, 09:25
#17
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от Иванов Дмитрий Посмотреть сообщение
Кривизна это все! Действительно ,напрямую нельзя заменить элемент списка по номеру. Autolist позорище!!! В нем вообще нет массивов как таковых. Жалею что очень зря когда-то начал изучать этот недоязык. Надо было на Си, ++, #, VB, не важно, но только не на этом самогонном агрегате
Похоже на высер обиженного младенца. С тем же успехом, можно сказать, что все это объектное ориентирование слишком узкоспециализированное и на нём даже не написать сраненький драйвер для устройств, то ли дело Ассемблер.
Скажите, уважаемый. Сколько времени вам понадобится, чтобы на ваших пресловутых НЕ позорных языках, написать функцию схожую, например, с vlax-curve-getclosestpointto или того более vlax-curve-isperiodic? Или вы любите отверткой гвозди заворачивать?
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
 
Непрочитано 16.11.2015, 10:30
#18
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от miko2009 Посмотреть сообщение
по моему ничего страшного нету переучиться , пару месяцев......
чтобы не воспринимать лисп как нечто несуразное - надо на нем достаточно регулярно писать.. полгодика назад пробовал на лиспе писать, в какой мере азы освоил.. даже до специфических вещей типа реакторов дошел в силу необходимости.. но потом ушел обратно в NetApi / Interop и сейчас для меня лисп снова фактически "чужой"...
Сергей812 вне форума  
 
Непрочитано 16.11.2015, 13:45
#19
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


ну для любителей массивов есть (vlax-safearray-put-element var index... value)
Vov.Ka вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как заменить значение элемента в списке?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Autolisp Acad2008 Каким образом заменить значение атрибута в динамическом блоке Zaghim LISP 12 14.03.2023 10:19
вывод значения элемента массива параметров sms ANSYS 30 25.06.2018 11:41
Проблемы с расчетом Ж/Б каркаса в ANSYS derik ANSYS 457 04.07.2017 16:16
DCL урок на примере. Pavel_GP Программирование 22 03.11.2011 13:20
ГОСТ Р 53231-2008 UnyqUm Поиск литературы, чертежей, моделей и прочих материалов 5 15.09.2009 14:41