2015-01-28 6 views
-1

У меня есть вложенный список, содержащий более тысяч подсписков как этотПеребор и манипулируя вложенные списки в Python

x=[[1,2,4,4,5],[1,2,5,4,5],[1,2,5,4,5],[1,2,4,4,5],[1,2,3,4,5]....] 

Я хочу перебрать это и проверить определенную последовательность целых чисел в пределах всех подсписков. Если последовательность третьего элемента {x[2]} в трех последовательных подсписках составляет 4,5,5, то я хочу, чтобы значение этих целых чисел было заменено на 9,10 и 11 соответственно. В приведенном выше примере мой новый список будет выглядеть так:

x=[[1,2,9,4,5],[1,2,10,4,5],[1,2,11,4,5],[1,2,4,4,5],[1,2,3,4,5],....] 

Я использую python 2.7. Любой вход был бы весьма признателен.

+1

Пожалуйста, покажите нам код, который вы написали. – Kevin

+0

У вас была какая-то попытка до того, как вы столкнулись с проблемой? если это так, покажите нам свой код, пока мы не сможем вам помочь! – Kasramvd

+0

Это один из шагов огромного процесса обработки данных, я не мог понять, с чего начать с этого, поэтому я ничего не писал до сих пор. Я собираюсь реализовать логику slaters и посмотреть, работает ли она. –

ответ

2

Это относительно использование ключевого слова enumerate в python.

Конкретно в вашем случае, так как это, кажется, все вложенные списки находятся на том же уровне, вы можете просто итерацию по списку верхнего уровня:

for index, item in enumerate(x): 
    if (item[2], x[index+1][2], x[index+2][2]) == (4, 5, 5): 
     item[2] = 9 
     x[index+1][2] = 10 
     x[index+2][2] = 11 

Тем не менее, есть несколько случаев края здесь с которыми я хочу поговорить, на которые я не буду отвечать. В частности, есть ли какие-либо проблемы, когда мы начинаем доходить до конца списка?

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

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

+0

Это один из тех случаев, когда я мог бы использовать 'range' непосредственно вместо enumerate, чтобы сохранить симметрию между каждым элементом кортежа, а не специальным корпусом, но это не имеет большого значения. – DSM

+0

@DSM Я бы, наверное, согласился, если бы я действительно использовал это, но я попытался сделать это решение инкапсулированной идеей и не совсем идеальным решением для plug-and-play. Спасибо за предложение, однако, должны помочь OP исследовать дальше. –

+0

Спасибо Slater и DSM! это то, что я использую, и он работал как шарм для i в диапазоне (len (linelist) -2): if ((linelist [i] [2] == 4) и (linelist [i + 1] [ 2] == 5) и (linelist [i + 2] [2] == 5)): линеастист [i] [2] = 9 линеастист [i + 1] [2] = 10 линеунист [i + 2] [2] = 11 –

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