2015-06-23 4 views
2

Я пытаюсь найти, если в списке есть некоторые последовательности чисел. Если это так, этот кортеж следует удалить из списка. Числа должны быть смежными друг с другом.Как найти последовательность чисел в списке

Пример:

список кортежей:

list_1 = [(), (1,), (3,), (2,), (4,), (1, 3), (1, 2), (1, 4), (3, 2), (3, 4), (2, 4), (1, 3, 2), (1, 3, 4), (1, 2, 4), (3, 2, 4), (1, 3, 2, 4)] 

и второй список:

list_2 = [1,3,2,4] 

В этом случае элементы (1, 3), (3, 2), (2, 4), (1, 3, 2), (3, 2, 4), (1, 3, 2, 4), (1, 3, 4), (1, 2, 4) в list_1 должны быть удалены, поскольку они содержат номера (не обязательно все из них!), которые смежны в list_2.

Я хочу, чтобы проверить, если элементы в списке

Я пытался что-то вроде этого:

for i in range(len(lista)): 
    teste = [] 
    for j in range(len(lista[i])): 
     for k in stuff: 
      if len(lista[i]) >= 2: 
       if lista[i][j] == k: 
        teste.append(k) 
        if len(teste) == 2: 
         lista.remove(lista[i]) 
         teste=[] 

      else: 
       pass 

С этого выхода:

if len(lista[i]) >= 2: 
IndexError: list index out of range 

Я пытался проверить номер, добавляемых он в список проверить следующий, и если он был добавлен слишком я бы удалить соответствующий кортеж.

+0

Что вы пробовали до сих пор? Кроме того, строго говоря, 'list_1' является списком кортежей, а не множеств. – mhawke

+0

Отредактировано. Благодарю. –

+1

Порядок имеет значение при удалении последовательности? –

ответ

3

Здесь вы идете, я думаю, это работает.

Если вы хотите удалить пустой набор, просто удалите его, однако вы определяете совпадение. Я добавил комментарий для этого.

Фиксированные на основе вашего комментария

print("List 1:", list_1) 
print("List 2:", list_2) 
removeElements = [] 
for k in range(len(list_1)): 
    #if len(list_1[k]) == 0: 
    # removeElements.append(k) 
    count = 0 
    for i in range(0, len(list_2)): 
     for j in range(0, len(list_1[k])): 
      if len(list_2) <= i + j: 
       break 
      count = count + 1 
      if list_1[k][j] != list_2[i + j]: 
       count = 0 
      if count == 2: 
       print("removing", list_1[k]) 
       removeElements.append(k) 

removeElements = sorted(set(removeElements)) 
for i in range(len(removeElements)): 
    list_1.pop(removeElements[i] - i) 

print("List_1:", list_1) 
+0

'range (0, n)' такой же как 'range (n)' –

+0

ok, если у меня разные номера, он не работает. Я тестировал с: list_1 = [(), (1,), (3,), (2,), (4,), (1, 3), (1, 2), (1, 4), (3, 2), (3, 4), (2, 4), (1, 3, 2), (1, 3, 4), (1, 2, 4), (3, 2, 4) (1, 3, 2, 4)] и list_2 = [1, 3, 2, 4] Эти матчи были: ('Мы имеем совпадение с индексом', 0, 'индексу' , 1, ', который соответствует', (1, 3)) ('У нас есть совпадение по индексу', 1, 'с индексом', 2, ', которое соответствует', (3, 2)) ('У нас есть совпадение по индексу ', 2,' с индексом ', 3,', которое соответствует ', (2, 4)) (' У нас есть совпадение по индексу ', 1,' с индексом ', 3', которое соответствует ' , (3, 2, 4)) –

+0

Исправлено и удалили элементы. – Diesel

0

Если вы хватаете window рецепт от old python example это становится легко:

from itertools import islice 

def window(seq, n=2): 
    "Returns a sliding window (of width n) over data from the iterable" 
    " s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...     " 
    it = iter(seq) 
    result = tuple(islice(it, n)) 
    if len(result) == n: 
     yield result  
    for elem in it: 
     result = result[1:] + (elem,) 
     yield result 

Тогда вы можете просто держать элементы, которые не появляются в любом окне из list_2

[t for t in list_1 if t not in window(list_2, len(t))] 

Однако, у вас, кажется, есть специальные обернутые кортежи с нулевым или одним элементом, поэтому вам нужно будет изменить фильтр

[t for t in list_1 if len(t) < 2 or t not in window(list_2, len(t))] 
+0

Я получаю это сообщение об ошибке: NameError: глобальное имя 'islice' не определено –

+1

'islice' определено в' itertools', я добавил строку импорта –

+0

Я обновил вопрос, потому что, думаю, я был недостаточно ясен , –

0

Это один из способов сделать это:

list_1 = [(), (1,), (1,2), (1,4)] 
y = [list(i) for i in list_1] 

list_2=[3,1,2,4] 
x = [list_2[0:2], list_2[1:3], list_2[2:4]] 

new_list_1 = [tuple(i) for i in y if i not in x[0:]] 

Выход:

[(), (1,), (1, 4)]