2014-01-20 4 views
2

Я рассмотрел здесь список и нашел решение для этого.Доступ к предыдущему элементу в понимании списка

Ближайший Я пришел, это вопросы, которые совет, используя enumerate(), итерации в понимании списка.

Что я хотел бы сделать, это получить доступ к предыдущему элементу в понимании списка. The context is this question on another StackExchange site.

В принципе, если я получаю эту строку от stdin - 4,6,+2,+8, я хотел бы вывести массив, который является целым числом числа, или числом плюс значение предыдущего элемента. В данном случае последний массив: 4,6,8,16 - или 4,6,6+2,(6+2)+8. Переход слева направо с помощью массива и цикл для его тривиального генерации, но мне любопытно узнать, можно ли это сделать в одном понимании списка.

Что касается того, что у меня есть:

from sys import* 
s=argv[1].split(',') 
for i in range(len(s)): 
s[i]=eval(`s[i-1]`*(s[i][0]=='+')+s[i]) 
print s 

который печатает правильный результат, однако следующий список понимание не делает:

s=argv[1].split(',') 
s=[eval(s[i-1]*(x[0]=='+')+x) for i,x in enumerate(s)] 
print s 

Какие результаты в:

[4, 6, 8, 10] 

Какие является равным 4, 6, +2+6, +2+8.

То, что я хотел бы быть в состоянии сделать, наконец, что-то вдоль линий:

s=[eval(PRIOR_VALUE*(x[0]=='+')+x) for x in argv[1].split(',')] 

Так можно легко получить доступ к предварительно вычисленному элементу списка понимания в том же списке понимании?

+4

Это может быть сложно .. – aIKid

ответ

2

Итак, могу ли я легко получить доступ к предыдущему вычисленному элементу понимания списка в том же понимании списка?

Легко? №

Если вы хотите сделать что-то трудным для себя, существует множество способов сохранить информацию о состоянии в понимании списка. Например,

prev = [None] 

s = [prev.__setitem__(0, val) or val 
    for item in list 
    for val in [something(item, prev[0])]] 

Это не очень хорошая идея.

+0

+1 для «Это не очень хорошая идея» –

+0

Я могу попробовать другой подход. Приветствия. –

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