24

我已阅读Slicing a list into n Near-equal-length partitions [duplicate]问题的答案。

这是公认的答案

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

改组列表不会保留顺序。你可以做这样的事情(很容易适应两个以上的部分)。完全未经测试。

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 回答