2010-02-21 3 views
3

В принципе позволяет сказать, что у меня есть:Увидеть, существует ли список в другом списке?

>>> a = [1,3,2,2,2] 
>>> b = [1,3,2] 

Я хочу, чтобы увидеть, если все элементы Ь, существует в пределах, и в том же порядке. Итак, для приведенного выше примера b будет существовать внутри a.

Я нахожусь в надежде, что это действительно простой ответ на одну строчку.

+2

Что вы пробовали? Это звучит как домашнее задание, так что было бы хорошо показать, что вы сделали. –

+4

Вы имеете в виду: «Я хочу, чтобы все элементы из b существовали ** последовательно ** в пределах». «В том же порядке» - более слабое утверждение. –

+0

Извините, я пробовал делать это долгий путь просто пройти через, проверяя, правильно ли первый элемент, затем продолжайте, если следующий равен второму продолжению, иначе начните сначала. Написание этой большой петли кажется утомительным и неряшливым. Однако я собираюсь использовать это много. Это для рабочего проекта, связанного с кодировкой длины пробега, используемой определенной системой заказа/доставки. В принципе, единственный способ, которым мы можем реально взаимодействовать и иметь пользовательскую функциональность, - это работать непосредственно с порядком работы, который является ужасным кодом 80 cthulu. – UberJumper

ответ

6

Это простой O (Н * м) Алгоритм:

any(a[i:i + len(b)] == b for i in range(len(a) - len(b) + 1)) 

Обратите внимание, что это не самый быстрый способ сделать это. Если вам нужна высокая производительность, вы можете использовать аналогичные методы для тех, которые используются в string searching algorithms.

+0

Это довольно элегантно! –

+0

отлично, это именно то, что я искал. – UberJumper

0

Это, вероятно, не очень эффективно, но вы можете использовать:

In [1]: a = [1,3,2,2,2] 

In [2]: b = [1,3,2] 

In [3]: b == [val for val in a if val in b] 
Out[3]: False 

In [4]: a = [6,1,3,2,5,4] 

In [5]: b == [val for val in a if val in b] 
Out[5]: True 

Первый тест возвращает значение False из дубликатов 2. Вопрос в том, как вы хотите иметь дело с дубликатами в целом. Если вы хотите, чтобы отрезать их в конце, то вы можете обрезать список длины a:

In [6]: a = [1,3,2,2,2] 

In [7]: b == [val for val in a if val in b][:len(b)] 
Out[7]: True 
-2

, если его «в том же порядке»,

>>> a = [1,3,2,2,2] 
>>> b = [1,3,2] 
>>> ' '.join(map(str,b)) in ' '.join(map(str,a)) 
True 

>>> a = [1,1,2,2,2,13,2] 
>>> b = [1,3,2] 
>>> ' '.join(map(str,b)) in ' '.join(map(str,a)) 
False 
+0

Это также возвращает 'True' для' b = [13, 2] '. (Нет требования, чтобы строковое представление элементов в списках для всех было одним символом). –

+0

, тогда мы присоединяемся к пробелу и не будем пустым. это должно исправить это. – ghostdog74

+0

Извините, это не исправляет. Теперь это вернет 'True' для' a = ['1', '2'] 'и' b = ['1 2'] '. (В вопросе также нет требования, чтобы элементы были числами). –

1

Вот решение, работает для списков ints.

Включите, например, [1, 3, 2] в строку «1», «3», «2». Затем используйте встроенное включение строки, чтобы узнать, находится ли он в другом списке.

repr(map(str, b))[1:-1] in repr(map(str, a))[1:-1] 
2

Если на «в том же порядке» вы имели в виду подпоследовательности (в отличие от подстроки), то это не-один вкладыш должен работать быстро:

def is_subsequence(x, y): 
    i, j = 0, 0 
    while i < len(x) and j < len(y): 
     if x[i] == y[j]: 
     i += 1 
     j += 1 
    return i == len(x) 
+0

Если вы хотите, чтобы ваш код был самокомментирующим, вам действительно нужно переименовать 'x' и' y' в более описательные имена; в противном случае документируйте свой код и объясните, что именно. Это 'is_subsequence (" abcecde "," cde ")' или 'is_subsequence (" cde "," abcecde ")'? – tzot

0

Извините, но то, что вы хотите сделать фактически совпадает с сопоставлением строк (хотя и со списками вместо строк). Вы можете посмотреть на Knuth-Morris-Pratt или Boyer Moore для алгоритма линейного времени.

EDIT:
Я предполагаю, что «в порядке» вы имеете в виду последовательно в любом месте в последовательности. Если они могут быть разделены другими элементами между ними, то это не то решение, которое вы хотите.

Смежные вопросы