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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Номера позиций повторяющихся элементов списка

Номера позиций повторяющихся элементов списка

Ответ
Поиск в этой теме
Непрочитано 27.02.2006, 11:39 #1
Номера позиций повторяющихся элементов списка
CB
 
Конструирование в области нефтеразведки
 
Гомель
Регистрация: 10.02.2006
Сообщений: 321

Подскажите пожалуйста как можно определить номера (индексы)
повторяющихся элементов списка. Например в списке
(49 52 46 50 53 130 128 131 130 128 130 131 130) элемент '130
повторяется 4 раза. Хотелось бы получить
(130 . (5 8 10 12)), где (5 8 10 12) номера элемента '130 в списке.
Спасибо!
Просмотров: 8865
 
Непрочитано 27.02.2006, 11:47
#2
asys

архитектор
 
Регистрация: 10.08.2005
Ростов-на-Дону
Сообщений: 5,295


смотря что за объект. Я делал так, если просто текст - команда QSELECT и выбор текста по содержимому (contents), если блок - то делаю имя чтоб по нему легче искать.
asys вне форума  
 
Автор темы   Непрочитано 27.02.2006, 11:50
#3
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Не понял? Ни какого объекта нет - есть список из чисел.
CB вне форума  
 
Непрочитано 27.02.2006, 11:58
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Примерно так
Код:
[Выделить все]
(setq lst_dat '(49 52 46 50 53 130 128 131 130 128 130 131 130))
(setq res nil i 0)
(mapcar (function
	 (lambda (x)
	   (if (setq buf (cadr (assoc x res)))
	     (setq res (subst (list x (append buf (list i)))
			      (assoc x res)
			      res
			      )
		   )
	     (setq res (append res (list(list x (list i)))))
	     )
	   (setq i (1+ i))
	   )
	 )
       lst_dat
       )
(princ "\nРезультат=")(princ res)
VVA вне форума  
 
Непрочитано 27.02.2006, 11:58
#5
asys

архитектор
 
Регистрация: 10.08.2005
Ростов-на-Дону
Сообщений: 5,295


тогда я не въехал в тему
asys вне форума  
 
Автор темы   Непрочитано 27.02.2006, 12:04
#6
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Спасибо. Сейчас проверю.
CB вне форума  
 
Автор темы   Непрочитано 27.02.2006, 12:17
#7
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Да!!! Это то что нужно. Огромное спасибо за помощь.
CB вне форума  
 
Автор темы   Непрочитано 27.02.2006, 12:46
#8
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Вопрос для VVA
А можно ли сделать, чтобы результатом функции
был не список (1 2 3 4 5 6 7 8 9 10), а список с индексами
интересующего меня элемента - например (130 (5 8 10 12)).
Я конечно понимаю, что в переменной res есть все что надо,
но все таки.
CB вне форума  
 
Непрочитано 27.02.2006, 13:45
#9
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,189
<phrase 1=


Вот пример еще:
Код:
[Выделить все]
(defun test (lst / a b lst2)
  (setq a -1)
  (setq lst2 (mapcar '(lambda (i) (cons (setq a (1+ a)) i)) lst))
  (mapcar
    '(lambda (b)
       (list b
	     (mapcar 'car
		     (VL-REMOVE-IF-NOT '(lambda (i) (eq (cdr i) b)) lst2)
	     )
       )
     )
    (vl-sort lst '>)
  )
)
;;;(test '(49 52 46 50 53 130 128 131 130 128 130 131 130))
;;;Вернет:((131 (7 11))
;;;      (130 (5 8 10 12))
;;;      (128 (6 9))
;;;      (53 (4))
;;;      (52 (1))
;;;      (50 (3))
;;;      (49 (0))
;;;      (46 (2))
;;;    )
Apelsinov вне форума  
 
Автор темы   Непрочитано 27.02.2006, 14:18
#10
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Спасибо. Это тоже работает. Но точно также как предыдущий пример
от VVA. Сможет ли кто продолжить код, который я думаю
должен работать как мне надо? Заранее благодарю.

(setq lst '(49 52 46 50 53 130 128 131 130 128 130 131 130))
(mapcar '(lambda (X)
(foreach Y lst
(if X (list X ... (список с номерами элемента '130)
'(130)
)
CB вне форума  
 
Непрочитано 27.02.2006, 14:31
#11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Вариант Apelsinov мне нравится больше.
Код:
[Выделить все]
(setq res (test '(49 52 46 50 53 130 128 131 130 128 130 131 130)))
(if (assoc 130 res)
  (progn
   (princ "\nИндексы элемента 130=")
   (princ (cadr (assoc 130 res)))
  )
  (princ "\nНет элемента")
)
VVA вне форума  
 
Непрочитано 27.02.2006, 14:40
#12
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Или так
Код:
[Выделить все]
(defun index_el ( el  lst / a b lst2) 
  (setq a -1) 
  (setq lst2 (mapcar '(lambda (i) (cons (setq a (1+ a)) i)) lst))
  (assoc el
  (mapcar 
    '(lambda (b) 
       (list b 
        (mapcar 'car 
           (VL-REMOVE-IF-NOT '(lambda (i) (eq (cdr i) b)) lst2) 
        ))) 
    (vl-sort lst '>)))
)
;;;(index_el 130 '(49 52 46 50 53 130 128 131 130 128 130 131 130))
;;;Вернет (130 (5 8 10 12))
;;;(index_el 135 '(49 52 46 50 53 130 128 131 130 128 130 131 130))
;;;Вернет nil
VVA вне форума  
 
Автор темы   Непрочитано 27.02.2006, 15:01
#13
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Да это конечно классно!!!
Только я не пойму для чего используется (vl-sort lst '>) ?
Благодарю за помощь ВСЕХ!
CB вне форума  
 
Непрочитано 27.02.2006, 15:14
#14
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,189
<phrase 1=


CB
:roll: У этой функции vl-sort есть особенность - удаляются повторяющиеся элементы, для этого тут и используется. Может это и не очень правильно ее тут использовать, но работает ведь 8)
Apelsinov вне форума  
 
Непрочитано 27.02.2006, 15:33
#15
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


А может проще через старый добрый FOREACH:
Код:
[Выделить все]
(defun list-pos (lst elem / cnt result)
(setq cnt 0)
(foreach item lst
  (if (equal elem item 0.00001)
  (setq result (cons cnt result)))
  (setq cnt (1+ cnt))
  (setq lst (reverse lst)))
(append (list elem)(list (reverse result)))
)
; TesT : (list-pos lst_dat 130)
~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 27.02.2006, 15:52
#16
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Что то у меня после теста кода от Fatty возвращается
(130 nil), может что не так делаю?
Спасибо. RS: собственно самостоятельно я и хотел использовать
foreach, только не знал как.
CB вне форума  
 
Непрочитано 27.02.2006, 16:12
#17
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от CB
Что то у меня после теста кода от Fatty возвращается
(130 nil), может что не так делаю?
Спасибо. RS: собственно самостоятельно я и хотел использовать
foreach, только не знал как.
Вместо LST написал LST_DAT, исправил...

~'J'~
fixo вне форума  
 
Непрочитано 27.02.2006, 16:16
#18
Елпанов Евгений

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


А можно и так:
Код:
[Выделить все]
(defun test (i lst n /)
  (cond
    ((not lst) nil)
    ((= (car lst) i) (cons n (test i (cdr lst) (1+ n))))
    (t(test i (cdr lst) (1+ n)))
  )
)
i = искомое значение
lst = тестируемый список
n = начиная с какого числа нумеровать позицию
Проверка
Код:
[Выделить все]
(test 130 '(49 52 46 50 53 130 128 131 130 128 130 131 130) 0)
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 27.02.2006, 16:52
#19
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Да... Информации для размышления столько, что не успеваю пере-
варивать. Практически одно и тоже, но сколько способов!
Последний код вообще меня поразил своей простотой
и отсутствием (setq...), да не обидятся на меня все те, кто помогал
мне со своими вариантами. Узнал я сегодня много, как классно что
есть ИНЕТ!!!
RS: Предыдущей темой от меня почему то народ не заинтересовался,
поэтому эта тема - как бы продолжение той.
Ведь чтобы разделить список на части по условию необходимо
знать номер позиции разделителя, ну а дальше(как мне кажется)
достаточно просто. В этой теме мне предложили много вариантов для дальнейшей работы. ОГРОМНОЕ ВСЕМ СПАСИБО!!!
CB вне форума  
 
Непрочитано 27.02.2006, 17:24
#20
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,189
<phrase 1=


Елпанов Евгений
Шедеврально!

Я вот тоже хотел рекурсию сварганить, но запутался вконец....а тут такая штука - БРАВО!

CB
Цитата:
Последний код вообще меня поразил своей простотой
в рекурсии простота кажущаяся.
Apelsinov вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Номера позиций повторяющихся элементов списка

Размещение рекламы