당신이 plist에 사용되는 예는 실제로 alist입니다.
'((:lang . 'js)
(:lang . 'html5)
(:lang . 'css)
(:lang . 'sass)
(:writing . 'org)
(:writing . 'markdown))
간단히 말하면 :
- plist는 키 -> 값 쌍, 예를 들어 평면의 목록
'(:a 1 :b 2 :c 3)
- alist은 car = the 키와 cdr = 값을 가진 목록 목록입니다.
'((a . 1) (b . 2) (c . 3))
.
만 쌍 목록을 반복하려는 경우, PHILS 대답 괜찮지 만, 데이터 세트가 작은 수없는 경우 (예를 들어,> 40 개 항목) 당신은, 즉 ":lang css
가 회원 가입을 테스트해야 사용 설정 하시겠습니까? "라는 메시지가 표시되면 hash table을 사용해보십시오.
이유는 키가 고유하지 않기 때문입니다. (assq :lang alist)
은 '(:lang . js)
을 산출 할 것이다. 나머지는 첫 번째 경기에서 가려집니다. 이 alist으로 유일한 선택은 member
입니다 :
(member '(:lang . css) alist)
그러나 member
는 O (N)입니다. 괜찮 으면 다시 phils가 대답합니다. 그렇지 않은 경우 (예 : 자주 조회하는 경우) 고유 한 기호 키 (예 : :lang-css
과 같은 하나의 기호로 lang 및 css를 연결)를 입력을 다시 구성하고 assq
(여전히 O (n)이지만 더 빠름)을 사용하십시오.) 대신 hash table을 사용하십시오. 해시 테이블에 대한
우리는 약간 PHILS '대답을 수정해야합니다
;; initialize the hash table if necessary
(unless table
(setq table (make-hash-table :test #'equal)))
(let (pkey)
(dolist (i mplist)
(if (keywordp i)
(setq pkey i)
;; (puthash KEY VALUE HASH-TABLE)
(puthash (cons pkey i) t table))))
이 그럼 당신은
(gethash '(:lang . css) table)
와 함께 O (1) 회원 확인을하거나
(maphash (lambda (pair _) [...]) table)
와 쌍을 반복 할 수 있습니다.
희망 하시겠습니까?
tks u @phils, 그것은 나에게 의미가 있습니다! – babygau