2012-12-11 3 views
1

Предположим, у меня есть набор {a, b, c, d}. Я хочу создать из него «путь», который является генератором, который дает (a, b), затем (b, c), затем (c, d) (конечно, set неупорядочен, поэтому любой другой путь через элементы является приемлемым).Создание пути из итерабельного точек

Каков наилучший способ для этого?

ответ

3

Вот пример использования pairwise() рецепт от http://docs.python.org/3/library/itertools.html#itertools-recipes

>>> from itertools import tee 
>>> def pairwise(iterable): 
...  "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
...  a, b = tee(iterable) 
...  next(b, None) 
...  return zip(a, b) 
... 
>>> for pair in pairwise({1, 2, 3, 4}): 
...  print(pair) 
... 
(1, 2) 
(2, 3) 
(3, 4) 
2

Используйте Rolling or sliding window iterator in Python решения:

>>> from itertools import islice 
>>> def window(seq, n=2): 
...  "Returns a sliding window (of width n) over data from the iterable" 
...  " s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...     " 
...  it = iter(seq) 
...  result = tuple(islice(it, n)) 
...  if len(result) == n: 
...   yield result  
...  for elem in it: 
...   result = result[1:] + (elem,) 
...   yield result 
... 
>>> path = window({1, 2, 3, 4}) 
>>> for step in gen: 
...  print path 
(1, 2) 
(2, 3) 
(3, 4) 

Это происходит, чтобы следовать порядку сортировки, потому что для целых чисел питона hash(x) == x и, таким образом последовательности 1, 2, 3, 4 вставляются в указанном порядке в набор.

+0

Мне нравится этот рецепт, хотя он более общий, чем мне нужно. Интересно, почему этот рецепт был заменен другим в текущей документации 'itertools'? – max

+0

@max: он был заменен рецептом '' pairwise' для иллюстрации 'tee' '(http://hg.python.org/cpython/rev/ea058504104c). Рецепты там, чтобы показать функции модуля, и 'tee()' еще не использовался на этой странице. –

3
def gen(seq): 
    it = iter(seq) 
    a, b = next(it), next(it) 
    while True: 
    yield (a, b) 
    a, b = b, next(it) 

print(list(gen({1, 2, 3, 4}))) 
0

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

>>> from itertools import tee 
>>> def pairwise(iterable): 
     a, b = tee(iterable) 
     next(b, None) 
     return zip(a, b) 

>>> pairwise({1, 2, 3, 4}) 
<zip object at 0x0000000003B34D88> 
>>> list(_) 
[(1, 2), (2, 3), (3, 4)] 
0

Теперь, когда я понимаю, вопрос

 
from itertools import islice 
a = {'A','B','C','D'} 
zip(a,islice(a,1,None)) 
#[('A', 'C'), ('C', 'B'), ('B', 'D')] 
Смежные вопросы