【问题标题】:Can I chain hash table data in python我可以在python中链接哈希表数据吗
【发布时间】:2013-09-01 03:14:35
【问题描述】:

我在 python 中有一个哈希表,我有很多数据,有些是相同的,但我需要链接它们。

我想创建一个音乐数据库,如果我搜索一些名为 HZ 的数值,我可以找到歌曲的名称。

假设我有一首歌叫 Song 1,我测量它的 HZ 值,但具体来说它们是无数的 10。

我想做的是能够搜索任何HZ值并获得相同的结果。

Song 1
10 HZ 
20 HZ
30 HZ
40 HZ
50 HZ
60 HZ
70 HZ
80 HZ
90 HZ
100 HZ

因此,如果我输入这 10 个值中的任何一个,我将得到名称 Song 1 作为结果

【问题讨论】:

  • 70 是 10 的值吗?您想只获得歌曲 1 作为结果还是希望歌曲 1 包含结果?
  • 如果您的数据很大,您还可以考虑使用数据库。 “具体来说,他们有无数 10 个”是什么意思?

标签: python hashtable chaining


【解决方案1】:

只需使用内置字典。对于大多数用例而言,它比您自己编写的任何代码都高效得多。

听起来您想要的只是将歌曲名称存储为每个赫兹值的值。如果您有多首歌曲共享一个赫兹,您可以使用存储集合的字典(或仅使用默认字典)。

【讨论】:

    【解决方案2】:

    我会使用dictlists 作为值来存储数据。尝试类似:

    music = {10: [<Song 1>, <Song 3>],
             20: [<Song 1>, <Song 2>]
            }
    

    现在要查看所有 10HZ 的歌曲,只需使用:

    music[10]
    

    【讨论】:

      【解决方案3】:

      在您的字典(“哈希表”)中输入所有 HZ 值作为相同 'Song 1' 的键。很可能不止一首歌曲与另一首歌曲具有相同的 HZ 值。在这种情况下,您希望将不同的歌曲与同一个 HZ 保持在集合中,因此您的字典的值是歌曲集合而不是单个歌曲。实现这一点的最简单方法是:

          from collections import defaultdict
          musicDirectory= defaultdict(set)
      
          musicDirectory[ 10].add( 'Song 1' )
          musicDirectory[ 40].add( 'Song 1' )
          musicDirectory[ 70].add( 'Song 1' )
          musicDirectory[100].add( 'Song 1' )
          musicDirectory[ 10].add( 'Song 2' )
          musicDirectory[ 70].add( 'Song 2' )
          musicDirectory[ 50].add( 'Song 2' )
          musicDirectory[ 10].add( 'Song 3' )
          musicDirectory[ 50].add( 'Song 3' )
          musicDirectory[ 70].add( 'Song 3' )
      
          print(40,"HZ=",musicDirectory[10])
          print(70,"HZ=",musicDirectory[10])
      

      应该打印:

          40 HZ= {'Song 1'}
          70 HZ= {'Song 2', 'Song 3', 'Song 1'}
      

      因为只有一首 HZ=40 的歌曲,但其中三首 HZ=70。

      【讨论】:

      • 代码中存在一个缺陷,我注意到如果数据数量等于 HZ 数量,则得出的结果是错误的,但谢谢你,这正是我想要的: )
      • 没有问题它非常适合我正在做的事情
      • @user2693902 我的意思是接受答案,所以它不会保持打开状态。
      【解决方案4】:

      假设我有 10 首歌曲,每首歌曲都有一个频率,但只有 5 个可能的独特频率:

      In [18]: import numpy as np
      
      In [19]: from collections import defaultdict
      
      In [20]: songs = [''.join(np.random.choice(list(letters), size=10).tolist()) for _ in range(10)]
      
      In [21]: freqs = np.random.choice(range(10, 15), size=10).tolist()
      
      In [22]: data = defaultdict(list)
      
      In [23]: for freq, song in zip(freqs, songs):
         ....:     data[freq].append(song)
         ....:
      
      In [24]: dict(data)
      Out[24]:
      {10: ['qlogxhxscp', 'eqxaeiyujp', 'wnhyprymyq', 'snsqquyvmv'],
       11: ['toibbjljxi', 'lqdxucnrpv', 'mrxxwmnxil'],
       13: ['lxcpzbswxx'],
       14: ['gmdbimcwon', 'zafhszrwss']}
      

      或者,如果一首歌可以有多个频率,则使用set 而不是list

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-28
        • 2011-05-12
        • 2013-03-12
        • 2011-05-19
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 2012-05-06
        相关资源
        最近更新 更多