我想改进以下代码,将值列表分成两个子列表,这些子列表已被随机化和排序。下面的代码有效,但是我敢肯定有一种更好/更干净的方法来实现它。
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]
答案 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)
我认为您的代码很简短。您可以进行一些更改:
sorted()
。 Intervention = sorted(data[:30])
Intervention
和Control
: Intervention, Control = data[:30], data[30:]
30
替换为变量: half = len(data)//2
with
打开文件更安全。缩进停止后,该文件会自动关闭。with open('Randomised_Groups.txt', 'w') as f:
...
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)