Как вставить элемент перед указанием c подсписка? - PullRequest
1 голос
/ 18 марта 2020

У меня есть следующий список, для которого я хочу вставить 'x' перед каждым элементом, который имеет 't' в первом элементе каждого подсписка.

z = [['a', 2], ['t',4], ['r',9], ['t',1], ['u',2], ['p',7], ['y',9], ['t',1], ['s',3], ['v',1]]      

Мой ожидаемый результат:

z = [['a' 2], x, ['t',4], ['r',9], x, ['t',1], ['u',2], ['p',7], ['y',9], x, ['t',1], ['s',3], ['v',1]] 

Мой текущий код почти работает, но я не знаю, почему перед третьим подсписком с 't' не вставляется 'x', а вместо этого вставляется два 'x' перед вторым подсписком с 't '.

for sl in reversed(z):
    if sl[0] == 't':
        print(z.index(sl))  
        z.insert(z.index(sl),'x')

>>> print(z)

[['a', 2], 'x', ['t', 4], ['r', 9], 'x', 'x', ['t', 1], ['u', 2], ['p', 7], ['y', 9], ['t', 1], ['s', 3], ['v', 1]]

Почему я делаю не так? как это сделать?

1 Ответ

2 голосов
/ 18 марта 2020

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

Вместо этого вы можете создать новый список с пониманием списка, который выводит дополнительные x перед текущим подсписком, если первый элемент подсписка равен t:

z = [i for c, n in z for i in (*('x' if c == 't' else ()), [c, n])]

z становится:

[['a', 2], 'x', ['t', 4], ['r', 9], 'x', ['t', 1], ['u', 2], ['p', 7], ['y', 9], 'x', ['t', 1], ['s', 3], ['v', 1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...