2013-05-25 2 views
1

Можно ли получить следующее с помощью понимания, я попытался получить оба значения a, b и т. Д., Но единственный способ, который я знаю, - это индексирование, и когда я это делаю, я получаю строковый индекс из ассортимент.Получение двух значений с использованием понимания

path = ['a', 'b', 'c', 'd', 'e'] 

-

a, b 
b, c 
c, d 
d, e 
+0

Что она должна вернуться для пустого списка '[]'? Список len 1 '[x]'? – georg

+0

не будет пустого списка. –

+0

, который является наиболее эффективным по очень большим путям? –

ответ

5

Вы можете использовать zip здесь:

>>> lis = ['a', 'b', 'c', 'd', 'e'] 
>>> for x,y in zip(lis,lis[1:]): 
...  print x,y 
...  
a b 
b c 
c d 
d e 
+0

+1, вы дошли до меня, но я оставлю свой ответ, так как есть несколько случаев, когда подход итератора немного лучше (где исходные данные представляют собой список, они в значительной степени эквивалентны). –

3

Лучший способ достичь этого не через список понимания, но zip():

advanced = iter(path) 
next(advanced, None) 
for item, next_item in zip(path, advanced): 
    ... 

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

+0

Немного более читаемым IMHO будет: 'для item, next_item в zip (путь, islice (путь, 1, None))' ... Это более явный, чем 'iter', а затем' next''ing it –

+0

@JonClements If вы собираетесь импортировать 'itertools', вы можете использовать простое решение. Я не могу сказать, что использование 'islice' отличается от других, но это совершенно верно. –

+0

+1 Но вы должны сделать 'next (advanced, None)', это лучше, чем мое решение для этого случая – jamylak

4

itertools pairwise recipe работает на любой Iterable

from itertools import tee, izip 

def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

path = ['a', 'b', 'c', 'd', 'e'] 
>>> for x, y in pairwise(path): 
    print x, y 


a b 
b c 
c d 
d e 
>>> list(pairwise(path)) 
[('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e')] 
+0

+1, Хорошее решение для поддержки общих итераций. –

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