如何将列表拆分为 Python 中的两个唯一列表?

How can I split a list in two unique lists in Python?

你好,我有一个列表如下: listt = ['a','b','c','d','e','f','g','h' ,'i','j','k','l','m','n','o'] 15 名成员。

我想把它变成 3 个列表,我使用了这段有效的代码,但我想要唯一的列表。这给了我 3 个具有共同成员的列表。

import random

listt = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']
print(random.sample(listt,5))
print(random.sample(listt,5))
print(random.sample(listt,5))

使用 [:]all 成员从列表中切出,基本上将所有内容复制到一个新对象中。或者只需使用 list(<list>) 也复制:

print(random.sample(listt[:],5))

如果你只想洗牌一次,将洗牌结果存储到一个变量中,稍后复制:

output = random.sample(listt,5)
first = output[:]
second = output[:]
print(first is second, first is output)  # False, False

然后可以在不修改 firstsecond 的情况下修改原始列表。

对于嵌套列表,您可能希望使用 copy.deepcopy()

试试这个:

from random import shuffle


def randomise():
    listt = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']
    shuffle(listt)
    return listt[:5], listt[5:10], listt[10:]

print(randomise())

这将打印(例如,因为它是随机的):

(['i', 'k', 'c', 'b', 'a'], ['d', 'j', 'h', 'n', 'f'], ['e', 'l', 'o', 'g', 'm'])

与其对列表进行三次抽样,这将始终为您提供三个独立的结果,其中可能会为多个列表选择单个成员,您可以将列表随机洗牌一次 然后把它分成三部分。这样,您将获得三个不会共享任何项目的随机子集:

>>> random.shuffle(listt)
>>> list[0:5]
>>> listt[0:5]
['b', 'a', 'f', 'e', 'h']
>>> listt[5:10]
['c', 'm', 'g', 'j', 'o']
>>> listt[10:15]
['d', 'l', 'i', 'n', 'k']

注意random.shuffle会原地打乱列表,所以修改了原来的列表。如果你不想修改原来的列表,你应该先复制一份。

如果您的列表大于所需的结果集,那么您当然也可以使用组合结果大小对列表进行 一次 采样,然后相应地拆分结果:

>>> sample = random.sample(listt, 5 * 3)
>>> sample[0:5]
['h', 'm', 'i', 'k', 'd']
>>> sample[5:10]
['a', 'b', 'o', 'j', 'n']
>>> sample[10:15]
['c', 'l', 'f', 'e', 'g']

此解决方案还将避免修改原始列表,因此如果您想保持原样,则不需要副本。

如果您不在乎每个列表中的哪些项目,那么您最好将列表分成三份:

In [23]: L =  ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']                                                                                                     

In [24]: size = len(L)                                                                                                                                                          

In [25]: L[:size//3]                                                                                                                                                            
Out[25]: ['a', 'b', 'c', 'd', 'e']

In [26]: L[size//3:2*size//3]                                                                                                                                                   
Out[26]: ['f', 'g', 'h', 'i', 'j']

In [27]: L[2*size//3:]                                                                                                                                                          
Out[27]: ['k', 'l', 'm', 'n', 'o']

如果您希望它们具有原始列表中的随机元素,您只需要先打乱输入即可:

random.shuffle(L)