【问题标题】:How to test membership of sequence in python list? [duplicate]如何测试python列表中序列的成员资格? [复制]
【发布时间】:2014-05-13 02:17:26
【问题描述】:

我有一本由 {str: list} 组成的字典。

我要做的是找出可能存在于值中的具有特定序列的键。

例如字典的内容是这样的:

DOC3187 [1, 2, 3, 6, 7]
DOC4552 [5, 2, 3, 6]
DOC4974 [1, 2, 3, 6]
DOC8365 [1, 2, 3, 5, 6, 7]
DOC3738 [1, 4, 2, 3, 6]
DOC5311 [1, 5, 2, 3, 6, 7]

我需要找出序列为 [5,2,3] 的键,所以期望的返回应该是:

DOC4552, DOC5311

我使用的是 Python 3.3.2,字典大约有 400 条。

【问题讨论】:

  • 另外,请出示实际字典,而不仅仅是内容
  • @thefourtheye:我经常鼓励用户,尤其是那些刚接触 Stack Overflow 的用户,复制和粘贴实际代码和/或实际交互会议,以确保我们得到准确的图片。 OP当然没有在这里做到这一点。但是他或她已经准确地说明了字典中的内容。键是字符串,值是列表。如果不是内容,您甚至说“实际字典”是什么意思?您需要将其视为{'DOC3187': [1, 2, 3, 6, 7], 'DOC4552': [5, 2, 3, 6], 等吗?
  • @JohnY 虽然不是必须的,因为有足够的信息,最好只是复制粘贴字典来检查答案。

标签: python list membership


【解决方案1】:

对于字典中的任何序列 'seq' 和更长的序列,'myseq' 语句:

any(myseq[a:a+len(seq)] == seq for a in range(len(myseq)))

如果 seq 是 myseq 的子序列,则为 True,否则为 False

【讨论】:

    【解决方案2】:

    注意: 我意识到,如果您的列表包含 [15, 2, 36] 而确实包含字符串 5, 2, 3,那么这实际上会失败,所以它仅适用于特殊情况。

    既然你有一本字典,也许对键和字符串匹配的列表理解?它实际上和穿过元素的速度一样,根据timeit...

    s_list = [5,2,3]   # sequence to search for
    
    # Setting up your dictionary
    MyD = {'DOC3187' : [1, 2, 3, 6, 7],
        'DOC4552' : [5, 2, 3, 6],
        'DOC4974' : [1, 2, 3, 6],
        'DOC8365' : [1, 2, 3, 5, 6, 7],
        'DOC3738' : [1, 4, 2, 3, 6],
        'DOC5311' : [1, 5, 2, 3, 6, 7]}
    
    query = str(s_list)[1:-1]  # make a string of '5, 2, 3'    
    Matches = [ k for k in MyD if query in str(MyD[k]) ]
    

    结果:

    ['DOC5311', 'DOC4552']
    

    【讨论】:

      【解决方案3】:

      你可以使用这个功能:

      def find_key_in_dict(d, t):
          """ d is dict for searching, t is target list.
          -> return matching key list.
          """
          b_str = reduce(lambda x, y: str(x) + str(y), t)
          return map(lambda x: x[0], filter(lambda i: b_str in reduce(lambda x, y: str(x) + str(y), i[1]), d.items()))
      

      要查找值,可以使用reduce()函数将dict值(整数列表)和目标列表(也是整数列表)转换为字符串,然后用'in'判断dict值是否满足。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-31
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        • 1970-01-01
        • 2017-07-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多