Изменение предыдущего индекса с пониманием списка в Python

#python #python-3.x #list

#python #python-3.x #Список

Вопрос:

Я пытаюсь выяснить, как составить список в Python, используя понимание списка, который включает элементы, имеющие тип string и начинающиеся с «Test_1», «Test_2», «Test_3» или «Test_4», или представляет собой целое число, которому предшествует строка. Я также хочу убедиться, что все строки равны «Test_1» или «Test_2» или «Test_3» или «Test_4».

Однако я не уверен, как проверить, предшествует ли элементу строка.

Например, у меня есть следующий список.

 ['Test_3', 80, 'Test_4', 80, 90, 'Test_1', 0, 'Test_2', 0]
  

И я хочу преобразовать его в это.

 ['Test_3', 80, 'Test_4', 80, 'Test_1', 0, 'Test_2', 0]
  

Вот что у меня есть на данный момент.

 column = [x for x in column if type(x) is str and x == "Test_1" or x == "Test_2" or x == "Test_3" or x == "Test_4" or type(x) is int] 
  

Есть идеи? Заранее спасибо!

Комментарии:

1. Можете ли вы привести нам пример ввода и вывода, который вы хотели бы сгенерировать на основе ввода?

2. @larsks только что отредактировал мой первоначальный вопрос! Спасибо за помощь!

3. У вас никогда не бывает двух строк, следующих друг за другом?

4. можете ли вы поработать над своим сценарием, чтобы уточнить больше, например, 1. сколько вхождений следует ожидать между двумя строками, т.Е. 0 или 1 или 0 or more или 1 or more или maximum 2

5. @Gahan Там будет только одно число, предшествующее другому. Никогда не будет трех чисел подряд.

Ответ №1:

Попробуйте это:

 columns = [x for i, x in enumerate(column) if (i==0 and isinstance(x,(int,str))) or (isinstance(x,str) and isinstance(column[i-1], int)) or (isinstance(x,int) and isinstance(column[i-1],str))]
  

Требуется список column , затем проверьте предыдущий элемент и текущий элемент и выберите его, только если это пара str-int или пара int-str

Комментарии:

1. Удаляет ли это также последовательные строки?

2. да, это так. Условие требует, чтобы str следовал за int или наоборот.

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

Ответ №2:

Один из способов заключается в использовании itertools.groupby

 from itertools import groupby

column = ['Test_3', 80, 'Test_4', 80, 90, 'Test_1', 0, 'Test_2', 0]
[list(g)[0] for _, g in groupby(column,lambda x:isinstance(x,int))]
#['Test_3', 80, 'Test_4', 80, 'Test_1', 0, 'Test_2', 0]
  

Ответ №3:

Вот простое решение:

 import itertools
pairlist = [[column[i], column[i 1]] for i in range(len(column)-1)]
goodpairlist = [i for i in pairlist if isinstance(i[0], str)]
list(itertools.chain(*goodpairlist)