Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
4 / 4 / 0
Регистрация: 27.11.2010
Сообщений: 27
1

Превратить список с парной количеством элементов в ассоциативной список

16.11.2013, 15:38. Просмотров 1066. Ответов 14
Метки нет (Все метки)


И снова списки:
Дан список (a b c d ...) с парной количеством элементов. Превратить его в ассоциативной список. В качестве ключей взять элементы списка. В качестве значений - ИХ порядковые номера.
Как то так
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2013, 15:38
Ответы с готовыми решениями:

Функционал: каждые соседние два элемента списка с четным количеством элементов превратить в двухэлементный список
Здравствуйте! помогите пожалуйста со следующим заданием Определить функционал, который каждые...

Дан список (a b) (b c) (c d) .). Преобразовать его в ассоциативной список
Дан список ((a b) (b c) (c d) ...). Преобразовать его в ассоциативной список. В качестве ключей...

Дан список чисел парной длины
Дан список чисел парной длины (1 2 3 4 ...), и две двоарные функции +, и -. Определить функционал,...

Дан список чисел парной длины
Дан список чисел парной длины (1 2 3 4 ...), и две функции +, и -. Определить функционал, который...

14
Модератор
Эксперт Python
28370 / 15270 / 3010
Регистрация: 12.02.2012
Сообщений: 24,998
Записей в блоге: 4
16.11.2013, 19:14 2
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
5
6
7
8
9
(defun mk-asso (lst &optional (n 1))
  (cond ((null lst) nil)
        (t (cons (cons (car lst) n) (mk-asso (cdr lst) (+ n 1))))))
 
==> mk-asso
 
(mk-asso '(a b c d e f))
 
==> ((a . 1) (b . 2) (c . 3) (d . 4) (e . 5) (f . 6))
3
4 / 4 / 0
Регистрация: 27.11.2010
Сообщений: 27
16.11.2013, 22:25  [ТС] 3
Catstail, спасибо Вам!)
0
493 / 426 / 56
Регистрация: 29.04.2011
Сообщений: 443
16.11.2013, 23:22 4
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(defun ASSO (l l2)
    (if l
        (cons (cons (car l) (car l2)) (ASSO (cdr l) (cdr l2)))
        nil))
 
(ASSO '(a b c d e) '(1 2 3 4 5))
 
==> ((a . 1) (b . 2) (c . 3) (d . 4) (e . 5))
 
 
 
 
(defun ASSO (l l2)
    (mapcar 'cons l l2))
 
(ASSO '(a b c d e) '(1 2 3 4 5))
 
==> ((a . 1) (b . 2) (c . 3) (d . 4) (e . 5))
2
4478 / 4192 / 350
Регистрация: 12.05.2012
Сообщений: 2,952
16.11.2013, 23:50 5
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
5
(defun cons-n (w &optional (n 1))
  (when  w (cons (cons (car w) n) (cons-n (cdr w) (1+ n)))))
 
> (cons-n '(11 12 13 14))
((11 . 1) (12 . 2) (13 . 3) (14 . 4))
3
1045 / 939 / 107
Регистрация: 04.11.2012
Сообщений: 971
Записей в блоге: 3
17.11.2013, 00:09 6
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
5
6
(defun F (ls)
  (let ((n 0))
    (mapcar #'(lambda (x) (cons x (incf n))) ls)))
 
> (F '(a b c d e))
((a . 1) (b . 2) (c . 3) (d . 4) (e . 5))
3
2303 / 1061 / 77
Регистрация: 12.03.2013
Сообщений: 4,978
17.11.2013, 02:45 7
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
(defun f (xs)
  (iter (for i from 1)
        (for x in xs)
        (collect (cons x i))))
3
4478 / 4192 / 350
Регистрация: 12.05.2012
Сообщений: 2,952
17.11.2013, 10:35 8
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
5
6
7
(defun cons-n (w)
  (loop for a in w
        for b upfrom 1
        collect (cons a b)))
 
> (cons-n '(11 12 13 14))
((11 . 1) (12 . 2) (13 . 3) (14 . 4))
Добавлено через 1 минуту
Lisp
1
2
3
4
5
6
7
(defun cons-n (w)
  (loop for a in w
        for b from 1
        collect (cons a b)))
 
> (cons-n '(11 12 13 14))
((11 . 1) (12 . 2) (13 . 3) (14 . 4))
4
Модератор
Эксперт Python
28370 / 15270 / 3010
Регистрация: 12.02.2012
Сообщений: 24,998
Записей в блоге: 4
17.11.2013, 17:57 9
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
5
6
7
8
(defun task (lst)
  (mapcar 'cons lst (range 1 (length lst))))
 
==> task
 
(task '(a b c d e f))
 
==> ((a . 1) (b . 2) (c . 3) (d . 4) (e . 5) (f . 6))
2
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 4
19.11.2013, 23:22 10
А можно в лиспе использовать результат 1-й функции, как список для второй?

вот например есть 2 функции:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
(defun with-pairs (f w)
    (when w 
        (cons 
            (funcall f (car w) (cadr w)) 
            (with-pairs f (cddr w))
        )
    )
)
WITH-PAIRS
 
CL-USER 2 > 
(with-pairs #'list '(a b c d e f g h))
((A B) (C D) (E F) (G H))
и 2-я
Lisp
1
2
3
4
5
6
7
8
9
10
CL-USER 3 > 
(defun pairs-alist (xs)
  (mapcar #'(lambda (x)
              (cons (first x) (second x)))
          xs))
PAIRS-ALIST
 
CL-USER 4 > 
(pairs-alist '((A B) (B C) (E F) (G H))) 
((A . B) (B . C) (E . F) (G . H))
Их можно обьединить и заставить работать как одно целое, чтоб при вводе '(a b c d e f g h) мы получили ассоциативный список (точечную пару) (A . B) (B . C) (E . F) (G . H)?
спасибо
0
4478 / 4192 / 350
Регистрация: 12.05.2012
Сообщений: 2,952
19.11.2013, 23:29 11
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun with-pairs (f w)
    (when w 
        (cons 
            (funcall f (car w) (cadr w)) 
            (with-pairs f (cddr w)))))
 
(defun pairs-alist (xs)
  (mapcar #'(lambda (x)
              (cons (first x) (second x)))
          xs))
 
(defun cons-pairs (f w)
  (pairs-alist (with-pairs f w)))
 
> (cons-pairs #'list '(a b c d e f g h))
((A . B) (C . D) (E . F) (G . H))
3
Модератор
Эксперт Python
28370 / 15270 / 3010
Регистрация: 12.02.2012
Сообщений: 24,998
Записей в блоге: 4
19.11.2013, 23:35 12
Лучший ответ Сообщение было отмечено как решение

Решение

Естественно:

Lisp
1
2
(defun composition(f w)
 (pairs-alist  (with-pairs f w)))
2
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 4
19.11.2013, 23:44 13
Спасибо огромное
0
2303 / 1061 / 77
Регистрация: 12.03.2013
Сообщений: 4,978
20.11.2013, 05:41 14
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Catstail Посмотреть сообщение
Естественно
Эх, это разве композиция Вот, Композиция:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(in-package :cl-user)
 
(let ((modules (list :alexandria :iterate)))
  (mapc #'require     modules)
  (mapc #'use-package modules))
 
(defun with-pairs (f xs)
  (iter (for (x1 x2) on xs by #'cddr)
        (collect (funcall f x1 x2))))
 
(defun pairs-alist (xs)
  (iter (for (x1 x2) in xs)
        (collect (cons x1 x2))))
 
(pairs-alist (with-pairs #'list (list 1 2 3 4)))
 
(let ((f (compose #'pairs-alist
                  (curry #'with-pairs #'list))))
  (funcall f (list 1 2 3 4 5 6)))
3
Catstail
20.11.2013, 10:24     Превратить список с парной количеством элементов в ассоциативной список
  #15

Не по теме:


Разговор новых русских:
- Сколько стоит твой галстук?
- $400!
- Где покупал?
- Там-то...
- Ну, и дурак! Я знаю магазин, где такой галстук стоит $800!

0
20.11.2013, 10:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2013, 10:24
Привет! Вот еще темы с ответами:

Создать список L3 из элементов, входящих и в список L1 и в список L2
создать список л3 из элементов входящих и в список л1 и в список л2

Превратить список за схемой
Превратить список за схемой: -->

Превратить список по схеме
превратить список по схеме

Как превратить строку в список
То есть нужен код превращающий a = "Hello" в b = {"H", "e", "l", "l", "o"}


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.