1

セットがあるとします{a, b, c, d}。それから「パス」を作成したいと思います。これは 、、 (a, b)then (b, c)、thenを生成するジェネレーターです(c, d)(もちろんset順序付けされていないため、要素を通る他のパスはすべて受け入れられます)。

これを行うための最良の方法は何ですか?

4

5 に答える 5

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 に答える
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 に答える
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 に答える