Python 3.x 将列表拆分为随机有序的子列表

Python 3.x 将列表拆分为随机有序的子列表,python-3.x,Python 3.x,我想改进下面的代码,将一个值列表拆分为两个子列表,这两个子列表经过随机排序。下面的代码可以工作,但我相信有更好/更干净的方法可以做到这一点 import random data = list(range(1, 61)) random.shuffle(data) Intervention = data[:30] Control = data[30:] Intervention.sort() Control.sort() f = open('Randomised_Groups.txt', 'w'

我想改进下面的代码,将一个值列表拆分为两个子列表,这两个子列表经过随机排序。下面的代码可以工作,但我相信有更好/更干净的方法可以做到这一点

import random

data = list(range(1, 61))
random.shuffle(data)
Intervention = data[:30]
Control = data[30:]
Intervention.sort()
Control.sort()

f = open('Randomised_Groups.txt', 'w')
f.write('Intervention Group = ' + str(Intervention) + '\n' + 'Control Group = ' + str(Control))
f.close()
预期产出为:

Intervention = [1,3,7,9]

Control = [2,4,5,6,8,10]

像这样的东西可能就是你想要的:

import random

my_rng = [random.randint(0,1) for i in range(60)]

Control = [i for i in range(60) if my_rng[i] == 0]
Intervention = [i for i in range(60) if my_rng[i] == 1]

print(Control)
其想法是创建60个随机的1或0,作为将每个数字放入哪个列表的指示符。只有当您不需要两个列表的长度相同时,这才有效。要获得相同的长度,需要更改在本例中创建my\rng的方式

我做了进一步的修改,得到了同样长度的列表:

import random

my_rng = [0 for i in range(30)]
my_rng.extend([1 for i in range(30)])
random.shuffle(my_rng)
Control = [i for i in range(60) if my_rng[i] == 0]
Intervention = [i for i in range(60) if my_rng[i] == 1]

在这里,我没有在
my\rng
中随机添加1或0,而是得到了一个30秒和30秒的列表来洗牌,然后像以前一样继续

像这样的东西可能就是你想要的:

import random

my_rng = [random.randint(0,1) for i in range(60)]

Control = [i for i in range(60) if my_rng[i] == 0]
Intervention = [i for i in range(60) if my_rng[i] == 1]

print(Control)
其想法是创建60个随机的1或0,作为将每个数字放入哪个列表的指示符。只有当您不需要两个列表的长度相同时,这才有效。要获得相同的长度,需要更改在本例中创建my\rng的方式

我做了进一步的修改,得到了同样长度的列表:

import random

my_rng = [0 for i in range(30)]
my_rng.extend([1 for i in range(30)])
random.shuffle(my_rng)
Control = [i for i in range(60) if my_rng[i] == 0]
Intervention = [i for i in range(60) if my_rng[i] == 1]

在这里,我没有在
my\rng
中随机添加1或0,而是得到了一个30秒和30秒的列表来洗牌,然后像以前一样继续

这里是另一个更具动态性的解决方案,它使用内置的
随机
功能,只创建所需的列表(无额外内存),并且可以处理包含任何类型对象的列表(前提是对象可以排序):

可通过以下方式进行测试:

data = list(range(1, 61))
random.shuffle(data)
temp = convert_to_random_list(data, 3)
print(temp)

下面是另一个更具动态性的解决方案,它使用内置的
随机
功能,只创建所需的列表(无额外内存),并且可以处理包含任何类型对象的列表(前提是对象可以排序):

可通过以下方式进行测试:

data = list(range(1, 61))
random.shuffle(data)
temp = convert_to_random_list(data, 3)
print(temp)

我认为你的代码已经很简短了。您可以进行一些更改:

  • 切片时调用
    sorted()
  • Intervention=sorted(数据[:30])

  • 您还可以在一行上定义
    干预
    控制
  • 干预,控制=数据[:30],数据[30:]

  • 我将用一个变量替换
    30
  • half=len(数据)//2

  • 使用
    打开文件更安全。当缩进停止时自动关闭文件
  • 使用f字符串可以缩短write语句:
  • 全部合并:

    import random
    
    data = list(range(1, 61))
    random.shuffle(data)
    half = len(data)//2
    Intervention, Control = sorted(data[:half]), sorted(data[half:])
    
    with open('Randomised_Groups.txt', 'w') as f:
        f.write(f'Intervention Group = {Intervention}\nControl Group = {Control}')
    

    我认为你的代码已经很简短了。您可以进行一些更改:

  • 切片时调用
    sorted()
  • Intervention=sorted(数据[:30])

  • 您还可以在一行上定义
    干预
    控制
  • 干预,控制=数据[:30],数据[30:]

  • 我将用一个变量替换
    30
  • half=len(数据)//2

  • 使用
    打开文件更安全。当缩进停止时自动关闭文件
  • 使用f字符串可以缩短write语句:
  • 全部合并:

    import random
    
    data = list(range(1, 61))
    random.shuffle(data)
    half = len(data)//2
    Intervention, Control = sorted(data[:half]), sorted(data[half:])
    
    with open('Randomised_Groups.txt', 'w') as f:
        f.write(f'Intervention Group = {Intervention}\nControl Group = {Control}')
    

    谢谢,这正是我想要的。我喜欢使用sorted方法删除代码的两行,而f string和open更干净。我已经接受了答案。谢谢,这正是我想要的。我喜欢使用sorted方法删除代码的两行,而f string和open更干净。我已经接受了答案。谢谢你的回答。这是一次比我更好的尝试!谢谢你的回答。这是一次比我更好的尝试!谢谢你的回答这是一个有趣的方法,但对我的编码技巧来说可能有点复杂谢谢你的回答这是一个有趣的方法,但对我的编码技巧来说可能有点复杂