Как проверить членство последовательности в списке питонов?
У меня есть словарь, который состоит из {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 ответа
ПРИМЕЧАНИЕ: я понял, что это на самом деле не удастся, если ваш список содержит [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']
Для любой последовательности 'seq' и более длинной последовательности в вашем словаре 'myseq' будет выглядеть так:
any(myseq[a:a+len(seq)] == seq for a in range(len(myseq)))
будет иметь значение True, если seq является подпоследовательностью myseq, иначе False
Вы можете использовать эту функцию:
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()))
Чтобы найти значение, вы можете использовать функцию redu (), чтобы изменить значение dict (целочисленный список) и целевой список (также целочисленный список) на строку, а затем использовать "in", чтобы определить, соответствует ли значение dict.