将列表分为随机排序的子列表

时间:2019-04-26 17:15:41

标签: 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')
f.write('Intervention Group = ' + str(Intervention) + '\n' + 'Control Group = ' + str(Control))
f.close()

输出应为

干预= [1,3,7,9]

控制= [2,4,5,6,8,10]

3 个答案:

答案 0 :(得分:1)

您可能想要这样的东西:

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]

在这里,我没有随机地将1或0添加到my_rng中,而是获得了30 0和30 1的列表以进行混洗,然后像以前一样继续。

答案 1 :(得分:1)

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

  1. 切片时请拨sorted()

Intervention = sorted(data[:30])

  1. 您还可以在一行上同时定义InterventionControl

Intervention, Control = data[:30], data[30:]

  1. 我将30替换为变量:

half = len(data)//2

  1. 使用with打开文件更安全。缩进停止后,该文件会自动关闭。
with open('Randomised_Groups.txt', 'w') as f:
    ...
  1. 使用f字符串可以使write语句更短:
f.write(f'Intervention Group = {Intervention} \nControl Group = {Control}')

全部合并:

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

答案 2 :(得分:0)

这是另一种使用内置random功能的动态解决方案,该功能仅创建所需的列表(无额外的内存),并且可以与包含任何类型的对象的列表一起使用(前提是可以对对象进行排序) :

import random
def convert_to_random_list(data, num_list):
    """
    Takes in the data as one large list and converts it into
    [num_list] random sorted lists.
    """
    result_lists = [list() for _ in range(num_list)] # two lists
    for x in data:
        # Using randint we pick which list to insert into
        result_lists[random.randint(0, num_list - 1)].append(x)
    # You could use list comprehension here with `sorted(...)` but it would take a little extra memory.
    for _list in result_lists: 
        _list.sort()
    return result_lists

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

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