Как проверить членство последовательности в списке питонов?

У меня есть словарь, который состоит из {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.

Другие вопросы по тегам