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

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

обработка списка

Ответ
Поиск в этой теме
Непрочитано 25.11.2009, 13:38 #1
обработка списка
luser
 
Регистрация: 20.04.2006
Сообщений: 67

как получить список вида

вход:
Код:
[Выделить все]
(("N"(список))
("A"(список))
("B"(список))
("E"(список))
("M"(список))
("N"(список))
("E"(список))
("M"(список))
("S"(список))
("G"(список))
("N"(список))
("1"(список))
("2.0"(список))
("N"(список))
("3.5"(список))
("2.0"(список))
("4.5"(список))
("13.8"(список)))

выход:создать выходный список (подсписки по ключу "N")
(("N"(список))("A"(список))("B"(список))("E"(список))("M"(список))
("N"(список))("E"(список))("M"(список))("S"(список))("G"(список))
("N"(список))("1"(список))("2.0"(список))
("N"(список))("3.5"(список))("2.0"(список))("4.5"(список))("13.8"(список)))

вот пример списка

входной список
(("N" (1 2 3 4 5 6 7 8))
  ("A" (0.00021 0.00013 0 0 0 0 0 0 0 0))
  ("V" (0.00018 0.00012 0 0 0 0 0 0 0 0))
  ("Y" (0.0001 0 0 0 0 0 0 0 0 0))
  ("Z" (0.00122	0.00091	0.00068	0.00051	0.00038	0.00029	0.00021	0.00016
		0.00012	0
	       )
  )
  ("C" (0.00035 0.00026 0.00019 0.00014 0.00011 0 0 0 0 0))
  ("Z" (0.00464	0.00345	0.00258	0.00193	0.00145	0.00109	0.00081	0.00061
		0.00045	0
	       )
  )
  ("N" (9 10 11 12 13))
  ("C" (0.00021 0.00013 0 0 0 0 0 0 0 0))
  ("D" (0.00018 0.00012 0 0 0 0 0 0 0 0))
  ("R" (0.0001 0 0 0 0 0 0 0 0 0))
  ("K" (0.00122	0.00091	0.00068	0.00051	0.00038	0.00029	0.00021	0.00016
		0.00012	0
	       )
  )
  ("F" (0.00035 0.00026 0.00019 0.00014 0.00011 0 0 0 0 0))
  ("T" (0.00464	0.00345	0.00258	0.00193	0.00145	0.00109	0.00081	0.00061
		0.00045	0
	       )
  )
)

выходной список
((("N" (1 2 3 4 5 6 7 8))
   ("A" (0.00021 0.00013 0 0 0 0 0 0 0 0))
   ("V" (0.00018 0.00012 0 0 0 0 0 0 0 0))
   ("Y" (0.0001 0 0 0 0 0 0 0 0 0))
   ("Z"	(0.00122 0.00091 0.00068 0.00051 0.00038 0.00029 0.00021 0.00016
		 0.00012 0
		)
   )
   ("C" (0.00035 0.00026 0.00019 0.00014 0.00011 0 0 0 0 0))
   ("Z"	(0.00464 0.00345 0.00258 0.00193 0.00145 0.00109 0.00081 0.00061
		 0.00045 0
		)
   )
 )
  (("N" (9 10 11 12 13))
    ("C" (0.00021 0.00013 0 0 0 0 0 0 0 0))
    ("D" (0.00018 0.00012 0 0 0 0 0 0 0 0))
    ("R" (0.0001 0 0 0 0 0 0 0 0 0))
    ("K" (0.00122 0.00091 0.00068 0.00051 0.00038 0.00029 0.00021
		  0.00016 0.00012 0
		 )
    )
    ("F" (0.00035 0.00026 0.00019 0.00014 0.00011 0 0 0 0 0))
    ("T" (0.00464 0.00345 0.00258 0.00193 0.00145 0.00109 0.00081
		  0.00061 0.00045 0
		 )
    )
  )
)

Последний раз редактировалось Кулик Алексей aka kpblc, 25.11.2009 в 15:02.
Просмотров: 3079
 
Непрочитано 25.11.2009, 14:27
#2
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


можно так:
Код:
[Выделить все]
(defun f (l)
 (cond
  ((not l) nil)
  ((= (caar l) "N")
   (cons (cons (car l) (f (reverse (cdr (member (assoc "N" (cdr l)) (reverse (cdr l)))))))
         (member (assoc "N" (cdr l)) (cdr l))
   ) ;_  cons
  )
  ((cons (car l) (f (cdr l))))
 ) ;_  cond
)
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 25.11.2009, 14:51
#3
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


это жжжесть, по коду Евгения проще понять, что нужно было сделать чем по заданию в 1 посте, а должно быть наоборот.
Sleekka вне форума  
 
Непрочитано 25.11.2009, 14:55
#4
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Sleekka Посмотреть сообщение
это жжжесть, по коду Евгения проще понять, что нужно было сделать чем по заданию в 1 посте, а должно быть наоборот.
у меня букв меньше?
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 25.11.2009, 14:57
#5
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


да + у тебя нет ошибок со скобками
Sleekka вне форума  
 
Непрочитано 25.11.2009, 15:11
#6
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Sleekka Посмотреть сообщение
да + у тебя нет ошибок со скобками
перечитал задание, посмотрел скобки, кажется я неверно его понял...
Вот исправление:
Код:
[Выделить все]
(defun f (l)
 (cond ((not l) nil)
       ((= (caar l) "N")
        (cons (cons (car l)
                    (f (if (assoc "N" (cdr l))
                        (reverse (cdr (member (assoc "N" (cdr l)) (reverse (cdr l)))))
                        (cdr l)
                       ) ;_  if
                    ) ;_  f
              ) ;_  cons
              (f (member (assoc "N" (cdr l)) l))
        ) ;_  cons
       )
       ((cons (car l) (f (cdr l))))
 ) ;_  cond
)
А вообще странно, что автор не комментирует...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 25.11.2009, 15:11
#7
luser


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


ТЕСТОВЫЙ СПИСОК:
Код:
[Выделить все]
 (setq	l
	 (list (list "N" (list 1 2 3 4 5 6 7 8))
	       (list "A" (list 0.00021 0.00013 0 0 0 0 0 0 0 0))
	       (list "V" (list 0.00018 0.00012 0 0 0 0 0 0 0 0))
	       (list "Y" (list 0.0001 0 0 0 0 0 0 0 0 0))
	       (list "Z"
		     (list 0.00122 0.00091 0.00068 0.00051 0.00038
			   0.00029 0.00021 0.00016 0.00012 0
			  )
	       )
	       (list "C"
		     (list 0.00035 0.00026 0.00019 0.00014 0.00011 0 0 0 0 0)
	       )
	       (list "Z"
		     (list 0.00464 0.00345 0.00258 0.00193 0.00145
			   0.00109 0.00081 0.00061 0.00045 0
			  )
	       )

	       (list "N" (list 9 10 11 12 13))
	       (list "C" (list 0.00021 0.00013 0 0 0 0 0 0 0 0))
	       (list "D" (list 0.00018 0.00012 0 0 0 0 0 0 0 0))
	       (list "R" (list 0.0001 0 0 0 0 0 0 0 0 0))
	       (list "K"
		     (list 0.00122 0.00091 0.00068 0.00051 0.00038
			   0.00029 0.00021 0.00016 0.00012 0
			  )
	       )
	       (list "F"
		     (list 0.00035 0.00026 0.00019 0.00014 0.00011 0 0 0 0 0)
	       )
	       (list "T"
		     (list 0.00464 0.00345 0.00258 0.00193 0.00145
			   0.00109 0.00081 0.00061 0.00045 0
			  )
	       )


	       (list "N" (list 25 36 89))
	       (list "0.2" (list 0.00021 0.00013 0 0 0 0 0 0 0 0))
	       (list "0.5" (list 0.00018 0.00012 0 0 0 0 0 0 0 0))
	       (list "1.58" (list 0.0001 0 0 0 0 0 0 0 0 0))
	       (list "r"
		     (list 0.00122 0.00091 0.00068 0.00051 0.00038
			   0.00029 0.00021 0.00016 0.00012 0
			  )
	       )
	       (list "n"
		     (list 0.00035 0.00026 0.00019 0.00014 0.00011 0 0 0 0 0)
	       )
	       (list "-0.25"
		     (list 0.00464 0.00345 0.00258 0.00193 0.00145
			   0.00109 0.00081 0.00061 0.00045 0
			  )
	       )




	 )
  )

Последний раз редактировалось luser, 25.11.2009 в 17:51.
luser вне форума  
 
Непрочитано 25.11.2009, 15:14
#8
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


luser
1. почитай, как оформлять код на форуме...
2. проверь мой последний код, должно быть верно, если нет, убери из своего списка лишние цифры, оставь в списке только суть структуры.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 25.11.2009, 15:17
#9
luser


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


[b]Евгений[b]
Спасибо огромное за помощь!
Пытаюсь осмыслить ваш код.
luser вне форума  
 
Непрочитано 25.11.2009, 15:23
#10
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


luser, оформи тегами и остальные списки, но не забудь их отформатировать в лисп редакторе отступами! тогда будет все наглядно и понятно...

не отформатированный список сложен для восприятия - чтоб понять суть, надо в браузере считать скобки...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 25.11.2009, 16:04
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Елпанов Евгений, тэги расставлял я, а не luser.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.11.2009, 14:15
#12
luser


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


Евгений
Ваша функция замечательно работает но небольших по размеру списка, а на больших списках выдает следующее сообщение:
"Hard error occurred *** internal stack limit reached (simulated)",можно ли как-то обойти эту проблему?
и еще просьба можно сделать эту функцию более универсальной, т.е на вход передавать
список и ключ по которому ведется обработка.
luser вне форума  
 
Непрочитано 27.11.2009, 14:49
#13
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


luser, http://forum.dwg.ru/showthread.php?t=43592 посмотри.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.11.2009, 20:57
#14
VVA

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


Еще пару ссылок на эту тему
http://www.caduser.ru/forum/index.ph...D=23&TID=47549
http://www.theswamp.org/index.php?topic=24940.0
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 28.11.2009, 22:21
#15
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Чтобы обойти нужно не использовать рекурсию а использовать обычный цикл.
Sleekka вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > обработка списка



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lisp: Обработка объектов и получение списка свойств (координаты точек) Nanotronic LISP 2 23.04.2009 23:07
структурированный список Holon Программирование 22 11.09.2007 14:09
Исключение элементов одного списка из другого по маске Кулик Алексей aka kpblc Программирование 3 18.09.2006 17:31
чтение данных из файла Александер Программирование 6 08.09.2005 10:24