1

假设我有一套{a, b, c, d}. 我想从中创建一个“路径”,它是一个产生 (a, b), then (b, c), then的生成器(c, d)(当然set是无序的,所以任何其他通过元素的路径都是可以接受的)。

做这个的最好方式是什么?

4

5 回答 5

3

这是使用来自http://docs.python.org/3/library/itertools.html#itertools-recipespairwise()的配方的示例

>>> 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)
于 2012-12-11T12:29:12.157 回答
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})))
于 2012-12-11T12:14:41.010 回答
2

在 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)

这恰好遵循排序顺序,因为对于 python 整数hash(x) == x,因此 1、2、3、4 的序列按该顺序插入到集合中。

于 2012-12-11T12:14:22.210 回答
0

您可以使用pairwise itertools 配方

>>> 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)]
于 2012-12-11T12:30:06.313 回答
0

现在我明白了这个问题

从 itertools 导入 islice
a = {'A','B','C','D'}
zip(a,islice(a,1,None))
#[('A', 'C'), ('C', 'B'), ('B', 'D')]
于 2012-12-11T12:43:03.090 回答