【问题标题】:How can I split a list in two unique lists in Python?如何在 Python 中将列表拆分为两个唯一列表?
【发布时间】:2019-07-21 22:01:49
【问题描述】:

您好,我有一个清单如下: 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))

【问题讨论】:

  • 你想让这三个列表的内容是随机的吗?看起来你是这样做的,但这是一个需要忽略的关键细节。
  • 这能回答你的问题吗? Creating two lists from one randomly

标签: python list difference


【解决方案1】:

试试这个:

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'])

【讨论】:

    【解决方案2】:

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

    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)
    

    【讨论】:

      【解决方案3】:

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

      >>> 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']
      

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

      【讨论】:

        【解决方案4】:

        使用[:]所有 成员从列表中切出,这基本上将所有内容复制到一个新对象中。或者,只需使用 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()

        【讨论】:

        • 这行不通。它将独立地对输入的副本进行 3 次采样,这不会减少样本中常见元素的可能性
        • @inspectorG4dget 我不确定,我误解了这个问题吗? OP想要unique lists. this give me 3 lists that have mutual members.
        • 也许我误解了——我认为 OP 想要没有相互元素的列表
        • 采样总是会为输出创建一个新列表,因此如果您考虑 OP 的原始代码未修改列表,则无论您是否复制原始列表都不会产生影响。跨度>
        • @poke 我是这么认为的,这就是为什么我不太确定 OP 的预期结果是什么嗯。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        • 2010-09-27
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2018-11-05
        相关资源
        最近更新 更多