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

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

Как изменить одно значение сложного списка ?

Ответ
Поиск в этой теме
Непрочитано 05.06.2010, 15:32
Как изменить одно значение сложного списка ?
swkx
 
Регистрация: 22.01.2010
Сообщений: 311

День добрый.

lst - список вида ((1 a1 b1 c1) (2 a2 b2 c2) (3 a3 b3 c3) ....)

Подскажите, как мне какому-нибудь элементу списка присвоить определённое значение, например b2 = "X" и c2 = 100, т.е. обновленный список должен быть ((1 a1 b1 c1) (2 a2 "Х" 100) (3 a3 b3 c3) ....)
Просмотров: 6355
 
Непрочитано 08.06.2010, 08:34
#21
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от swkx Посмотреть сообщение
Уважаемые коллеги, как-то всё сложно у вас
Кто бы говорил! Засунуть первый элемент списка в скобки, а потом проверять его вот такой конструкцией:
Код:
[Выделить все]
(car (vl-member-if (function
(lambda (e) (= (caar e) num))
)
lst))
Вместо того, чтобы оставить список как он был изначально и делать так:
Код:
[Выделить все]
(assoc num lst)
А чтобы не путалось, можно оставшуюся часть списка в подсписок загнать: ((num1 (a1 b1 c1))...)
P.S.
Хотя и это будет лишним.
(cdr (assoc num lst))
и номер не мешает.

Последний раз редактировалось Do$, 08.06.2010 в 08:47.
Do$ вне форума  
 
Автор темы   Непрочитано 08.06.2010, 08:39
#22
swkx


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


СВ, напомню, что у меня уже вопросов нет Если твой вопрос просто из интереса, то поясняю. Исходный список:
(((1) S 0.0 nil) ((2) S 0.0 nil) ((3) S 0.0 nil))
в нём информация о трёх точках.
Допустим, мне нужно обновить информацию для 2-й точки
Эта конструкция
(car (vl-member-if (function (lambda (e) (= (caar e) num))) lst)
выдает мне
((2) S 0.0 nil), в котором я устанавливаю новые значения: S8 123.0 T
В конце концов получаю
(((1) S 0.0 nil) ((2) S8 123.0 Т) ((3) S 0.0 nil))

Do$, должен признать, ты прав
Учту на будущее

Последний раз редактировалось swkx, 08.06.2010 в 08:46.
swkx вне форума  
 
Непрочитано 28.06.2010, 07:48
#23
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Когда то такое делал, может пригодится кому (элементы считаются с нуля):
Код:
[Выделить все]
;|
Kr_Change-List
Функция меняет указанный елемент списка
Параметры:
Change_List	-Список для изменения
N_element	-Номер элемента
element		-Элемент на который меняем
Пример:
(Kr_change-list '(3 4 5.6 "erty" 0.0 0.0 0 0 (10 12.45 48.54) -25) 5 88)
|;

(defun Kr_Change-List (Change_List N_element element / n New_List)
  (setq n 0
	New_List '())
  
  (foreach p Change_List
    (if (= N_element n)
	    (setq New_List (append New_List (list element)))
	    (setq New_List (append New_List (list p)))
    );if
    (setq n (1+ n))
    );foreach
  New_List
  

  );end

;|
Kr_Change-SubList
Функция меняет указанный елемент подсписка
Параметры:
Change_List	- Список для изменения
N_SubList	- Номер заменяемого подсписка
N_element	- Номер элемента
element		- Элемент на который меняем
Пример:
(Kr_Change-SubList    '((1 4 5.6 "erty" 0.0 0.0 0 0 (10 12.45 48.54) -25)
		    	(2 4 5.6 "erty" 0.0 0.0 0 0 (10 12.45 48.54) -25)
		    	(3 4 5.6 "erty" 0.0 0.0 0 0 (10 12.45 48.54) -25)
		    	(4 4 5.6 "erty" 0.0 0.0 0 0 (10 12.45 48.54) -25))
  			2 7 88)
|;

(defun Kr_Change-SubList (Change_List N_SubList N_Element element)
 
 	(Kr_Change-List Change_List N_SubList (Kr_Change-List (nth N_SubList Change_List) N_Element element))

  );end

;|
Kr_Remove-Element-List
Функция удаляет указанный елемент списка
Параметры:
Change_List	-Список для изменения
N_element	-Номер элемента
element		-Элемент который удаляем
Пример:
(Kr_Remove-Element-List '(3 4 5.6 "erty" 0.0 0.0 0 0 (10 12.45 48.54) -25) 8)
|;

(defun Kr_Remove-Element-List (Change_List N_element / n New_List)
  (setq n 0
	New_List '())
  (foreach p Change_List
    (if (/= N_element n) (setq New_List (append New_List (list p))));if
    (setq n (1+ n))
   );foreach
  New_List
  );end
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 28.06.2010, 08:21
#24
swkx


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


Krieger,

у вас не лучший, по-моему, вариант, т.к. нужно перебирать все элементы списка, пока не нарвётесь на нужный. VL-MEMBER-IF гораздо эффективнее.

У меня другой вопрос:
можете аргументированно объяснить, чем забитый шуруп лучше вкрученного гвоздя ???
swkx вне форума  
 
Непрочитано 28.06.2010, 15:28
#25
Дима_

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


СУГУБО ИХМО если собираешься создать функцию у которой в качестве аргумента задается индекс элемента в списке (его порядковый номер) надо либо менять структуру списка, либо пора отдохнуть.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как изменить одно значение сложного списка ?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рифмоплетство. Kryaker Разное 554 14.11.2023 11:59
Как изменить единицу измерения расхода воздуха в Aunocad MEP 2009? samchik Вертикальные решения на базе AutoCAD 8 06.05.2009 17:18
как изменить окраску изометрии sdndrey AutoCAD 1 01.06.2004 08:55
как изменить окраску 3D модели sdndrey AutoCAD 3 31.05.2004 23:55
как изменить радиус окружности sasa AutoCAD 11 02.12.2003 02:23