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

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

Как сравнить два списка?

Ответ
Поиск в этой теме
Непрочитано 25.08.2013, 21:31 #1
Как сравнить два списка?
mamuk
 
Сургут
Регистрация: 06.05.2010
Сообщений: 248

доброго времени суток!! подскажите как сравнить два списка вида '((10 . x y) (10 . x y) (10 . x y)....) и '((10 . x y z) (10 . x y z) (10 . x y z)....) при том два списка не равны по количеству содержимого. Задача найти одинаковые по значениям x и y и сформировать новый список в котором будут ( 10 . x y z)?
Просмотров: 7627
 
Непрочитано 25.08.2013, 21:53
#2
Дима_

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


Ну, как вариант, как-то так:
Код:
[Выделить все]
 (defun test(l1 l2) 
  ((lambda (lst) (vl-remove-if-not '(lambda (x) (member (cdr (reverse x)) lst)) l2))
   (mapcar 'reverse l1)))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 25.08.2013, 21:58
#3
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


спасибо! потестю!!
mamuk вне форума  
 
Непрочитано 25.08.2013, 22:01
#4
gomer

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


вообще не понял ничего
gomer вне форума  
 
Автор темы   Непрочитано 25.08.2013, 22:59
#5
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


Цитата:
Сообщение от gomer Посмотреть сообщение
вообще не понял ничего
че я написал?
mamuk вне форума  
 
Непрочитано 25.08.2013, 23:22
#6
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,435
Отправить сообщение для maratovich с помощью Skype™


Offtop:
Цитата:
Сообщение от mamuk Посмотреть сообщение
че я написал?
С точки зрения бональной эрудиции, мы не можем игнорировыть тенденции, либо каждый мыслящий индивидуум амортизирует абстракции.

Я тоже не понял... Походу mamuk и Дима_ в одном кабинете сидят.
maratovich вне форума  
 
Непрочитано 25.08.2013, 23:43
#7
gomer

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


Цитата:
Сообщение от maratovich Посмотреть сообщение
Походу mamuk и Дима_ в одном кабинете сидят.
Шутки шутками, но код из #2 не будет работать со списками из #1. Точнее с ними не будет работать никакой код. Это раз. Списки из #1 уж очень похожи на ошметки полилинии, но в таком случае все это сравнение до одного места.
Offtop: С точки зрения банальной эрудиции и метафизической абстракции, не каждый мыслящий индивидуум в препубертатный период способен развивать тенденции к продуктивной регенерации

Последний раз редактировалось gomer, 25.08.2013 в 23:58.
gomer вне форума  
 
Непрочитано 25.08.2013, 23:44
#8
Дима_

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


Уж не знаю правильно ли я понял - судя по всему mamuk сравнивает двухмерные dxf коды с трехменрыми, но скорее всего делает это не правильно - т.к. не преобразует из системы координат объекта, а считает что лежит он строго в мск, но как говориться хозяин барин - что просил, то и написал (и если с таким кодом возникли трудности, то на следующий уровень наверное пока еще и не нужно - так-бы заработало), хотя как говориться чем дальше в лес, тем злее партизаны - может и так вполне хватит.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 25.08.2013, 23:44
#9
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


попробую без абстракций.
Есть чертеж в котором примитивы точки и блоки. координаты блока и точки совпадают. но блок имеет координату без Z т.е. она равна 0. а точка под этим блоком имеет точно такие же координаты, только с определенной Z. Есть необходимость получить список координат тех точек которые равны координатам блока. В моем случае я хочу получить координаты точек которые совпадают с координатами блока. вот я и думал получить два списка координат блока и точек и попытаться выудить нужные значения и сформировать список.
чертеж прилагаю
конкретно интересует блок BL_82
Вложения
Тип файла: dwg
DWG 2010
ПЕЧАТЬ.dwg (119.5 Кб, 2356 просмотров)
mamuk вне форума  
 
Непрочитано 25.08.2013, 23:51
#10
Дима_

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


Тут по хорошему надо написать свой member проверяющий точки с определенной погрешностью (типа минимальное расстояние менее чем определенный допуск) - но это тебе в качестве домашнего задания.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 26.08.2013, 00:08
#11
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Тут по хорошему надо написать свой member проверяющий точки с определенной погрешностью
а есть хоть какие то наводки (ссылки) почитать. заранее благодарен!
mamuk вне форума  
 
Непрочитано 26.08.2013, 00:11
#12
gomer

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Тут по хорошему надо написать свой member проверяющий точки с определенной погрешностью (типа минимальное расстояние менее чем определенный допуск)
Цитата:
Сообщение от mamuk Посмотреть сообщение
а есть хоть какие то наводки (ссылки) почитать. заранее благодарен!
Код:
[Выделить все]
 (equal '(0.0 0.1 0.0) '(0.0 0.01 0.0) 0.1)
gomer вне форума  
 
Непрочитано 26.08.2013, 09:56
#13
VVA

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Тут по хорошему надо написать свой member проверяющий точки с определенной погрешностью
По моему здесь было. Искать по слову _dwgru-assoc-multi
Для сравнения координат нужно немного доделать
Код:
[Выделить все]
(defun _dwgru-assoc-xy-multi-fuzz (key lst fuzz / OutList)
  ;;; key - ключ (точка)
  ;;; lst - список точек
  ;;; fuzz - точность
  (setq key (lst_xy key))
  (foreach pt lst
    (if (equal key (lst_xy pt) fuzz)
      (setq OutList (cons pt OutList))
      )
    )
  (reverse OutList)
  )
(defun lst_xy (lst)(mapcar '+ '(0.0 0.0) lst))
Пример
Код:
[Выделить все]
(setq lst_point '((0.0 0.0 100.0)(10.2 11.3 2.2)(3.3 4.2 50.50)(10.2 11.3 11.8)(22.2 0.5 20.22)))
(setq lst_blk '((10.2 11.3 0.0)(0.0 0.0 0.0)(3.3 4.2 0.0)(22.2 0.5 0.0)))
(setq point (car lst_blk))
(princ "\nТочка вставки блока:")(princ point)
(princ "\nНайденные точки:")(_dwgru-assoc-xy-multi-fuzz point lst_point 1e-6)(princ)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 26.08.2013, 11:08
#14
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,435
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от mamuk Посмотреть сообщение
координаты блока и точки совпадают
Что то я не нашел таких....
maratovich вне форума  
 
Автор темы   Непрочитано 26.08.2013, 19:46
#15
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


Цитата:
Сообщение от maratovich Посмотреть сообщение
Что то я не нашел таких....
только z не совпадает.
mamuk вне форума  
 
Непрочитано 26.08.2013, 20:03
#16
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,435
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от mamuk Посмотреть сообщение
только z не совпадает
Хоть одну координату напиши в которой совпадает точка вставки блока с точкой на чертеже.
maratovich вне форума  
 
Автор темы   Непрочитано 28.08.2013, 20:38
#17
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


452182.3687,6871901.6250
mamuk вне форума  
 
Непрочитано 19.10.2014, 19:36
#18
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Появилась задача сравнивать два разноименных набора на предмет одинаковости его членов. То есть, помимо количества объектов нужно выяснить, одни ли и те же объекты входят в эти наборы или нет.
В поисках ничего подобного не нашлось, и пришла мысль сравнивать списки примитивов. Нашел только эту тему, но тут такого решения нет...
Может, кто-то видел или писал нечто подобное, подскажите, буду весьма признателен.
skkkk вне форума  
 
Непрочитано 19.10.2014, 19:45
#19
Дима_

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


сравниваешь размеры, если равны берешь первый и проверяешь есть ли такой элемент во втором.
з.ы. еще подумать возможны-ли "дубли" объектов и если есть, то как их обрабатывать (тут возможны варианты - которые следует учесть в зависимости от задачи).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.10.2014, 20:28
#20
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Спасибо, Дим, а как думаешь: рациональнее сравнивать непосредственно наборы или списки примитивов?
Задача состоит в том, чтоб определить, совпадает ли некий набор, записанный в переменную, с выделенными в данный момент примитивами. По сему, дублей объектов не будет, так как один из сравниваемых наборов будет создаваться либо через (ssget "_I"), либо через (ssgetfirst), а это исключает повторное попадание примитивов в набор. Но для порядка, конечно, лучше обрабатывать дубли, однако, это сильно усложняет задачу, на мой взгляд, поэтому, думаю, вернусь к этому в случае необходимости.
Вот интересно, неужели ни у кого не возникало до сих пор такой задачи?
skkkk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как сравнить два списка?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите сделать сортировку списка атрибутов блока Wertgan Программирование 11 30.04.2015 17:17
Сортирвка списка последовательно, по приоритетам (вопрос) Tonic Программирование 9 02.02.2010 14:25
структурированный список Holon Программирование 22 11.09.2007 14:09
Исключение элементов одного списка из другого по маске Кулик Алексей aka kpblc Программирование 3 18.09.2006 17:31
чтение данных из файла Александер Программирование 6 08.09.2005 10:24