0

リストを 3 つの項目でグループ化し、そのような各グループを 2 つの項目の組み合わせでできるだけ簡潔に繰り返します。私はいくつかのことを試しましたが、そのうちの1つはコンパイルさえしていません:

from itertools import combinations
L = [1,2,3,4,5,6]
for a,b in combinations(zip(*[iter(L)]*3), 2): 
    print "{0:d} {1:d}".format(a,b)

期待される出力

1,2
1,3
2,3
4,5
4,6
5,6

命令文でこれを行うことができますが、宣言的な方法を探しています。

4

3 に答える 3

2

あなたは近くにいます。一度に 1 つのグループ化の組み合わせを実行してからchain、結果を得る必要があります (実際には、ここでchain.from_iterableはより適切です)。

from itertools import combinations,chain

lst = [1,2,3,4,5,6]
def group(a,n):
    return zip(*[iter(a)]*n)

for a,b in chain.from_iterable(combinations(grp, 2) for grp in group(lst,3)): 
    print "{0} {1}".format(a,b)
于 2013-04-16T13:32:14.223 に答える
2

近づいていますが、グルーパー シーケンスcombinations()の出力の各タプルに関数を適用する必要があります。zip()

from itertools import combinations, chain

for a, b in chain.from_iterable(combinations(group, 2) for group in zip(*[iter(a)]*3)):
    print "{} {}".format(a,b)

これで一連combinations()結果が得られたのでchain.from_iterable()、これらのそれぞれの出力を最終的なシーケンスにマージしていました。

これにより、目的の出力が生成されます。

>>> for a, b in chain.from_iterable(combinations(group, 2) for group in zip(*[iter(a)]*3)):
...     print "{} {}".format(a,b)
... 
1 2
1 3
2 3
4 5
4 6
5 6
于 2013-04-16T13:32:55.537 に答える
1

これがitertoolsandoperatorベースのソリューションです。他のソリューションほど簡潔ではありませんが、FWIW:

from itertools import imap, combinations, repeat, count, takewhile, izip, chain
from operator import getitem, truth
L = [1,2,3,4,5,6]
slicers = izip(count(0, 3), count(3, 3))
slices = (getitem(L, slice(*x)) for x in slicers)
slices = takewhile(truth, slices)
for x in chain.from_iterable(imap(combinations, slices, repeat(2))):
    print x

...
(1, 2)
(1, 3)
(2, 3)
(4, 5)
(4, 6)
(5, 6)
于 2013-04-16T14:12:57.930 に答える