24

リストをn個のほぼ等しい長さのパーティションにスライスする[重複]質問への回答を読みました。

これは受け入れられた答えです:

def partition(lst, n): 
    division = len(lst) / float(n) 
    return [ lst[int(round(division * i)): int(round(division * (i + 1)))] for i in xrange(n) ]

増分割り当てではなく、アイテムをパーティションにランダムに割り当てるために、これらのソリューションをどのように変更するのでしょうか。

4

6 に答える 6

39

random.shuffle()リストを分割する前に、リストを呼び出します。

于 2010-07-28T12:23:10.030 に答える
20

完全な2018ソリューション(python 3.6):

import random 
def partition (list_in, n):
    random.shuffle(list_in)
    return [list_in[i::n] for i in range(n)]

注意してください!これにより、元のリストが変更される可能性があります

于 2018-08-14T09:27:49.810 に答える
3

入力リストをシャッフルします。

于 2010-07-28T12:24:21.790 に答える
2

最初にリストをランダム化し、次にそれをn個のほぼ等しい部分に分割します。

于 2010-07-28T12:24:44.957 に答える
1

リストをシャッフルしても順序は保持されません。代わりに、このようなことを行うことができます(3つ以上の部分に適応するのは非常に簡単です)。完全にテストされていません。

from __future__ import annotations
from typing import TypeVar
import random

T = TypeVar("T")

def partition_list(s: list[T]) -> tuple[list[T], list[T]]:
    """
    Randomly partition a list into two lists, preserving order. The number to
    take is drawn from a uniform distribution.
    """
    len_a = random.randint(0, len(s))
    len_b = len(s) - len_a
    put_in_a = [True] * len_a + [False] * len_b
    random.shuffle(put_in_a)
    a: list[T] = []
    b: list[T] = []

    for val, in_a in zip(s, put_in_a):
        if in_a:
            a.append(val)
        else:
            b.append(val)

    return a, b
于 2022-01-11T11:49:44.427 に答える
0

順序も保持するランダムパーティション:

def partition_preserve_order(list_in, n):
    indices = list(range(len(list_in)))
    shuffle(indices)
    index_partitions = [sorted(indices[i::n]) for i in range(n)]
    return [[list_in[i] for i in index_partition] 
            for index_partition in index_partitions]

(つまり、インデックスをシャッフルしてから、パーティション内で並べ替えます)

例:

random_partition_preserve_order(list('abcdefghijklmnopqrstuvxyz'), 3)
# [
#     ['c', 'd', 'g', 'm', 'p', 'r', 'v', 'x', 'y'], 
#     ['b', 'e', 'h', 'k', 'o', 'q', 't', 'u'], 
#     ['a', 'f', 'i', 'j', 'l', 'n', 's', 'z']
# ]
于 2022-01-13T14:03:12.420 に答える