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

Вернуться   Форум 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)?
Просмотров: 7585
 
Непрочитано 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,437
Отправить сообщение для 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,437
Отправить сообщение для 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,437
Отправить сообщение для 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 вне форума  
 
Непрочитано 19.10.2014, 20:55
#21
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 190
Отправить сообщение для nolte с помощью Skype™


ежли сравниваешь примитивы поищи "хеш сумма" - это сумма списка entget примитива.
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Непрочитано 19.10.2014, 22:20
#22
VVA

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


Посмотри у Lee Mac'a еще функции :
List Box Functions
List Difference
List Intersection
List Symmetric Difference
List Union
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 19.10.2014, 23:03
#23
skkkk


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


Цитата:
Сообщение от nolte Посмотреть сообщение
ежли сравниваешь примитивы поищи "хеш сумма" - это сумма списка entget примитива.
nolte, нашел тему Lisp. Выделение нового в чертеже. С первого взгляда не понял, как определить такую сумму у отдельно взятого примитива, а разбираться и копать глубоко не охота... И есть подозрения, что это не самый быстродейственный вариант. Всё же списки обрабатывать, на мой взгляд, - менее ресурсоемкое занятие.
VVA, спасибо, Володь! В который раз выручаешь, когда уже не осталось надежд.
Я так понимаю, что из этих функций более всего подходят List Difference (если вернет ноль элементов, значит, списки равны) или List Intersection (если вернет все элементы одного списка, значит они равны). То, что надо.
skkkk вне форума  
 
Непрочитано 19.10.2014, 23:35
#24
gomer

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
сравниваешь размеры, если равны берешь первый и проверяешь есть ли такой элемент во втором.
сначала нужно отсортировать примитивы, преобразовав в набор список. не факт, что в двух наборах одни и те же примитивы будут в том же порядке
gomer вне форума  
 
Непрочитано 19.10.2014, 23:48
#25
Дима_

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


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


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


Цитата:
Сообщение от gomer Посмотреть сообщение
не факт, что в двух наборах одни и те же примитивы будут в том же порядке
Я так понял, что Дима_ предлагает проверять второй список на наличие 1-го примитива первого списка, затем на наличие 2-го примитива первого списка и т.д. В таком случае порядок не важен.
А если отсортировать, то можно просто попарно сравнивать n-ные примитивы каждого списка.
В первом случае имеем nxn итераций, во втором - сортировку и просто n итераций. Правильно я понимаю?
Только вот как сортировать? vl-sort? Какую тогда брать тест-функцию? Или в лоб, acad_strlsort?
skkkk вне форума  
 
Непрочитано 19.10.2014, 23:57
#27
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 190
Отправить сообщение для nolte с помощью Skype™


Цитата:
С первого взгляда не понял, как определить такую сумму у отдельно взятого примитива, а разбираться и копать глубоко не охота... И есть подозрения, что это не самый быстродейственный вариант. Всё же списки обрабатывать, на мой взгляд, - менее ресурсоемкое занятие.
полностью поддерживаю, сразу видно, что способ будет заторможенным
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Непрочитано 19.10.2014, 23:58
#28
skkkk


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


Пока писал, отвлекался, Дима_ сам ответил

----- добавлено через ~1 мин. -----
nolte, спасибо за участие
skkkk вне форума  
 
Непрочитано 20.10.2014, 02:04
#29
gomer

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


Как вариант использовать связку ssmemb и ssdel. если рекурсивно, то быстродействие останется на втором плане
gomer вне форума  
Ответ
Вернуться   Форум 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