Сначала создайте словарь, который отображает каждый термин на его id . Затем используйте словарь для создания желаемых списков:
from collections import Counter
a=['a','a','a','a','b','a','b','a','b','a','b','a','b','a','b','a','b','c','c','c','c','c','c','c','c','d','d','e']
b=['a','a','b','a','b','a','b','a','b','d','e']
aCounter=Counter(a)
bCounter=Counter(b)
v=sorted(aCounter.keys()|bCounter.keys())
idDict={item:i for i,item in enumerate(v) }
bresult=[(idDict[item[0]],item[0],item[1]) for item in bCounter.items()]
aresult=[(idDict[item[0]],item[0],item[1]) for item in aCounter.items() ]
print(bresult)
print(aresult)
Вывод:
[(0, «a», 5), (1, «b», 4), (3, «d», 1), (4, «e», 1)]
blockquote>
[(0, «a», 10), (1, «b», 7), (2, «c», 8), (3, «d», 2), (4, «e», 1) ]Объединение выполняется с использованием | оператор. используйте sorted для присвоения id = 0 для 'a'
Некоторые идеи:
Параметр командной строки отладки (с которым можно установить :set +d
в Объятиях), является информативным, но является очень подробным и не показывает Вам сокращения синтаксиса Haskell.
Судите Hat - Трассировщик Haskell. Я просто попробовал его на простой программе, и это довольно прохладно. Я не нахожусь в Windows, тем не менее, и я не знаю, как трудный это должно было бы получить его выполнение. Это, вероятно, довольно трудно, который является позором, так как здорово и по существу что Вы хотите. Если Вы действительно получаете его выполнение, можно получить что-то вроде этого информация от Hat:
main = {IO}
teneven = [2,4,6,8,10]
_foldr (\..) [1,2,3,4,5,6,7,8, ...] [] = [2,4,6,8,10]
(\..) 1 [2,4,6,8,10] = [2,4,6,8,10]
(\..) 2 [4,6,8,10] = [2,4,6,8,10]
(\..) 3 [4,6,8,10] = [4,6,8,10]
(\..) 4 [6,8,10] = [4,6,8,10]
(\..) 5 [6,8,10] = [6,8,10]
(\..) 6 [8,10] = [6,8,10]
(\..) 7 [8,10] = [8,10]
(\..) 8 [10] = [8,10]
(\..) 9 [10] = [10]
(\..) 10 [] = [10]
Лямбда там even
. Кроме того, если Вы хотите, Hat может проследить в вызовы foldr
и другие внутренние вызовы; по умолчанию это не делает этого.
Верьте мне, Вы не хотите идти этим путем.
Набор (и порядок) сокращений, используемых в каждом особом случае, зависел бы от конкретной реализации языка (объятия могли сделать это один путь, ghci - другим способом, jhc - в еще одном, и т.д.).
Лучше считайте что-то об общих способах реализовать compiler/interpreter/virual машину для функционального языка - как машина SECD и т.д.
Несколько ссылок:
Здесь у вас есть несколько примеров использования Debug.Trace и Hugs.Observe.
import Debug.Trace
fact :: Integer -> Integer
fact 0 = trace "fact 0 ->> 1" 1
fact n = trace ("fact " ++ show n) (n * fact (n-1))
import Hugs.Observe
fact :: Integer -> Integer
fact 0 = observe "fact 0" 1
fact n = observe "fact n" (n * fact (n-1))
Надеюсь, это поможет вам понять, как распечатать все сокращения с помощью WinHungs.