1

私はリストを持っています:

nums = [1, 2, 3, 4]

リストを分割するためのすべての可能性を取得したいと思います1 - 3

[
    ( 1, (2, 3, 4) ),
    ( 2, (1, 3, 4) ),
    ( 3, (1, 2, 4) ),
    ( 4, (1, 2 ,3) )
]

今私が見つけることができる最高のものは使用itertools.combinations(num, 3)ですが、それは各アイテムの2番目の部分、つまりを与えるだけ[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]です。私が使用できる他の方法はありますか?

4

4 に答える 4

6

あなたが解決している問題がどれほど一般的であるかに応じて、解決策は多かれ少なかれ単純になる可能性があります:)

In [1]: nums = [1, 2, 3, 4]

In [2]: [(x, tuple(y for y in nums if y != x)) for x in nums]
Out[2]: [(1, (2, 3, 4)), (2, (1, 3, 4)), (3, (1, 2, 4)), (4, (1, 2, 3))]

リストに繰り返し値がある場合は、インデックスを使用して比較します。

In [3]: [(x, tuple(y for j, y in enumerate(nums) if j != i)) for i, x in enumerate(nums)]
Out[3]: [(1, (2, 3, 4)), (2, (1, 3, 4)), (3, (1, 2, 4)), (4, (1, 2, 3))]
于 2012-05-10T10:06:46.547 に答える
2

You are halfway there. You can combine the result with your original list using zip and reversed:

result = zip(num, reversed(itertools.combinations(num, 3)))

But if you want to use the first part is some kind of index only, there is no need for that. You can use the position of the element in the list as index (obviously).

于 2012-05-10T09:58:59.197 に答える
2

これはより簡単な解決策のようです:

nums = [1, 2, 3, 4]
for n in range(len(nums)):
    print (nums[n], nums[:n] + nums[n+1:])

理解として:

result = [(s, nums[:n] + nums[n+1:]) for n, s in enumerate(nums)]
于 2012-05-10T10:12:59.273 に答える
0

これはトリックを行いますが、おそらく非効率的です:

>>> t=set(nums) ; [ (t.difference(x).pop(),x) for x in list(itertools.combinations(t,3)) ]
[(4, (1, 2, 3)), (3, (1, 2, 4)), (2, (1, 3, 4)), (1, (2, 3, 4))]
于 2012-05-10T10:05:53.287 に答える