假設我有一組集合{a, b, c, d}
。我想從它創建一個「路徑」,這是一個生成(a, b)
,然後(b, c)
,然後(c, d)
(當然set
是無序的,所以通過元素的任何其他路徑是可以接受的)的生成器。從可迭代的點生成路徑
這樣做的最好方法是什麼?
假設我有一組集合{a, b, c, d}
。我想從它創建一個「路徑」,這是一個生成(a, b)
,然後(b, c)
,然後(c, d)
(當然set
是無序的,所以通過元素的任何其他路徑是可以接受的)的生成器。從可迭代的點生成路徑
這樣做的最好方法是什麼?
下面是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)
使用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插入以該順序進入集的序列。
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})))
使用pairwise()
配方爲例,用戶可以使用pairwise
itertools 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)]
現在我明白的問題
from itertools import islice a = {'A','B','C','D'} zip(a,islice(a,1,None)) #[('A', 'C'), ('C', 'B'), ('B', 'D')]
我喜歡這個食譜,儘管它比我需要的更一般。我想知道爲什麼這個配方在當前的'itertools'文檔中被替換爲另一個? – max
@max:它被替換爲['pairwise'配方來說明'tee'](http://hg.python.org/cpython/rev/ea058504104c)。這裏的配方是爲了炫耀模塊的功能,'tee()'還沒有在這個頁面上使用。 –