Я не знаком с Python 3.1, но будет ли это работать?
[chr(x) for x in [66, 53, 0, 94]]
Существует несколько встроенных способов сделать это. Один путь был бы:
(remove-if-not 'good-enough-score-p word-list)
И другой:
(loop for word in word-list
when (good-enough-score-p word)
collect word)
И все же другой:
(mapcan (lambda (word)
(when (good-enough-score-p word)
(list word)))
word-list)
И т.д... Существует также РЯД, и Выполнить итерации. Выполнить итерации версия идентична версии ЦИКЛА, но СЕРИЙНАЯ версия интересна:
(collect (choose-if 'good-enough-score-p (scan word-list))))
Так, да, Вы, очень вероятно, заново изобретите некоторое колесо.:-)
Функция, которую Вы хотите, remove-if-not
, который встроен.
(defun remove-low-words (word-list)
(remove-if-not #'good-enough-score-p word-list))
Если Вы чувствуете, что переосмысливаете что-то, чтобы сделать со списками, Вы, вероятно. Проверьте Гиперспецификацию для наблюдения.
Существует пара путями, можно сделать это. Во-первых, и вероятно наиболее легко, можно сделать это рекурсивно.
(defun remove-low-words (word-list)
(if (good-enough-score-p (car word-list))
(list word (remove-low-words (cdr word-list)))
(remove-low-words (cdr word-list))))
Вы могли также сделать это с mapcar
и reduce
, где первый может создать Вас список с провальными элементами, замененными nil
и последний может использоваться для отфильтровывания nil
.
Или был бы хороший кандидат на макрос "фильтра" или функцию, которая берет список и возвращает список, фильтрованный некоторым предикатом.