Вопрос списка Python - PullRequest
       20

Вопрос списка Python

5 голосов
/ 27 октября 2011

Мне нужны некоторые подсказки или пример, как я могу локализовать в списке a список b, а затем заменить его списком c.

a=[1,3,6,2,6,7,3,4,5,6,6,7,8]

введите список b (это список, который программа ищет в списке a).

b=[6,7]

при обнаружении вернуть мне индексы, в которых был найден подсписок, и каждый раз заменять его на c=[0,0], поэтому результат будет

[1,3,6,2,0,0,3,4,5,6,0,0,8]

Ответы [ 4 ]

4 голосов
/ 27 октября 2011

Вот более эффективный подход, чем мой первый, с использованием нарезки списка:

>>> for i in xrange(len(a) - len(b) + 1):
...     if a[i:i+len(b)] == b:
...         a[i:i+len(b)] = c
... 
>>> a
[1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8]

Первая попытка для потомков ....

Если вам не нужнопромежуточные индексы, вот один из подходов, использующий строковые функции и функциональный подход, не модифицирующий ваш список на месте.

>>> a_as_str = ','.join(str(i) for i in a)
>>> print a_as_str
1,3,6,2,6,7,3,4,5,6,6,7,8
>>> b_as_str = ','.join(str(i) for i in b)
>>> b_as_str
'6,7'
>>> c_as_str = ','.join(str(i) for i in c)
>>> c_as_str
'0,0'
>>> replaced = a_as_str.replace(b_as_str, c_as_str)
>>> replaced
'1,3,6,2,0,0,3,4,5,6,0,0,8'
>>> [int(i) for i in replaced.split(',')]
[1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8]

Это может быть изменено на:

3 голосов
/ 27 октября 2011

вы можете сделать что-то похожее (написано в python 3.2, используйте xrange в python 2.x):

for i in range(0, len(a)):
    if a[i:i+len(b)] == b:
        a[i:i+len(b)] = c

это будет учитывать списки всех размеров.Это предполагает list b == list c Я не знаю, если это то, что вы хотите, однако, пожалуйста, укажите, если это не так.

Вывод для списков:

a = [1,2,3,4,5,6,7,8,9,0]
b = [1,2]
c = [0,0]
Output:
[0, 0, 3, 4, 5, 6, 7, 8, 9, 0]
1 голос
/ 27 октября 2011

Я приведу вам пример

li=[1,3,6,2,6,7,3,4,5,6,6,7,8]
for i  in range(len(li)): 
    if li[i:i + 2] == [3, 4]: 
        li[i:i + 2] = [0, 0]

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

0 голосов
/ 28 октября 2011

Важно также учитывать, что происходит, когда данный шаблон создается заменой.

Я думаю, что эта функция должна обрабатывать все случаи, как предполагалось:

def replace(a, b, c):
    ii = 0
    while ii <= (len(a) - len(b) + 1):
        print(ii)
        if a[ii:ii+len(b)] == b:
            a[ii:ii+len(b)] = c
            ii += len(b)
        else:
            ii += 1
    return a


Вывод с использованием исходного примера:

[1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8]


Вот пример, где подстановка создает шаблон поиска:

a = [1,1,1,1,1,1,1,1,1,6,6,7,7,1]
b = [6,7]
c = [0,6]

Вывод соответствует ожидаемому:

[1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 0, 6, 7, 1]



Любые идеи о том, как сделать это немного более кратко?

...