如何在python列表中测试序列的成员资格?

时间:2014-05-13 02:17:27

标签: python list membership

我有一个由{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个项目。

3 个答案:

答案 0 :(得分:2)

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

any(myseq[a:a+len(seq)] == seq for a in range(len(myseq)))
如果seq是myseq的子序列,

将评估为True,否则为

答案 1 :(得分:0)

您可以使用此功能:

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值是否满足。

答案 2 :(得分:0)

注意: 我意识到,如果您的列表包含[15, 2, 36],其中包含字符串5, 2, 3,则实际上会失败,因此它仅适用于特殊情况。< / em>的

既然你有一本字典,可能列出了对键和字符串匹配的理解吗?根据{{​​1}} ...

,它实际上与遍历元素的速度相同
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]) ]