哈希表,计数重复键,方案

时间:2015-11-22 22:34:37

标签: hash scheme

我希望有人可以在我继续寻找解决方案时帮助我。

我对如何遍历哈希表并找到重复键感到困惑。我想删除重复项,但要巩固它们的值。

所以,说我有一个字符串列表:

Enter the flow time required: 1250
8477
timestep: 8477

file(s) found:  ['E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h0-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h1-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h2-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h3-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h4-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h5-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h6-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h7-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h8-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h9-8477.txt']
working in: E:/Fall2015/Research/CFD/ddn110B/Transfer/xline on: h0-8477
Traceback (most recent call last):

  File "<ipython-input-52-0503f720722f>", line 54, in <module>
    data2 = np.loadtxt(filename, skiprows=1)

  File "E:\WinPython-64bit-2.7.10.3\python-2.7.10.amd64\lib\site-packages\numpy\lib\npyio.py", line 691, in loadtxt
    fh = iter(open(fname, 'U'))

IOError: [Errno 2] No such file or directory: 'h9-8477.txt'

我将它们存储在一个哈希表中,其中的值是列表中的索引位置。

所以,我想构建一个这样的哈希表:

(define strings '("abcde" "bcdea" "cdeab" "deabc" "eabcd" "abcde"))

每个字符串都是一个键,该值是找到该字符串的索引列表。基本上,我正在计算一个大字符串中子字符串的出现次数,并注意它们的位置。

我知道如何制作哈希表:

(abcde (0, 5))
(bcdea 1)
(cdeab 2)
(deabc 3)
(eabcd 4)

这只是构建密钥及其值的哈希表,它不考虑表中是否已存在密钥。

我很感激任何建议。如果有人不介意一步一步地跟我走,我会非常感激,我正在努力学习计划。

我正在使用RSR5。

2 个答案:

答案 0 :(得分:1)

您使用的是SRFI 69吗?查看hash-table-update!

答案 1 :(得分:1)

诀窍是检查每个键是否已有值,如果是,我们将其附加到列表中 - 根据定义,每个键只能与一个值相关联。我想你正在寻找这样的东西:

(define strings '("abcde" "bcdea" "cdeab" "deabc" "eabcd" "abcde"))
(define values  '(0 1 2 3 4 5))

(define my-hash-table (make-hash))
(for-each (lambda (s v)
            (hash-update! my-hash-table
                          s
                          (lambda (a) (cons v a)) ; add element to list
                          (lambda () '())))       ; we start with '()
          strings
          values)

或者,我们可以使用函数式编程来创建和更新哈希表:

(define my-hash-table
  (foldl (lambda (s v a)
           (hash-update a
                        s
                        (lambda (a) (cons v a)) ; add element to list
                        (lambda () '())))       ; we start with '()
         (hash)
         strings
         values))

无论哪种方式,它都按预期工作:

(hash->list my-hash-table) ; we get a keys/values list for free
=> '(("eabcd" 4) ("deabc" 3) ("bcdea" 1) ("cdeab" 2) ("abcde" 5 0))