セットがあるとします{a, b, c, d}
。それから「パス」を作成したいと思います。これは 、、 (a, b)
then (b, c)
、thenを生成するジェネレーターです(c, d)
(もちろんset
順序付けされていないため、要素を通る他のパスはすべて受け入れられます)。
これを行うための最良の方法は何ですか?
セットがあるとします{a, b, c, d}
。それから「パス」を作成したいと思います。これは 、、 (a, b)
then (b, c)
、thenを生成するジェネレーターです(c, d)
(もちろんset
順序付けされていないため、要素を通る他のパスはすべて受け入れられます)。
これを行うための最良の方法は何ですか?
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})))
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)
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のシーケンスがこの順序でセットに挿入されるため、これはソートされた順序に従います。
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)]
質問を理解したので
itertoolsからisliceをインポートします a = {'A'、'B'、'C'、'D'} zip(a、islice(a、1、None)) #[('A'、'C')、('C'、'B')、('B'、'D')]