2012-12-11 53 views
1

假設我有一組集合{a, b, c, d}。我想從它創建一個「路徑」,這是一個生成(a, b),然後(b, c),然後(c, d)(當然set是無序的,所以通過元素的任何其他路徑是可以接受的)的生成器。從可迭代的點生成路徑

這樣做的最好方法是什麼?

回答

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

使用pairwise()配方爲例,用戶可以使用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')]