-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrandom_tools.py
64 lines (59 loc) · 1.76 KB
/
random_tools.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# -*- coding:utf-8 -*-
'''
本模块提供与随机选取相关的函数
'''
import re
import os
import sys
import csv
import xlrd
import time
import codecs
import random
import chardet
import numpy as np
from copy import deepcopy
try:
import cPickle as pickle
except:
import pickle
def seed_random(where, seed = None):
'''
本函数用于在指定范围内利用指定种子生成一个随机整数
[seed](int): 生成随机数的种子
[where](list): 第一个元素为起始位置,第二个元素为结束位置
'''
if seed:
random.seed(seed)
return random.randrange(where[0],where[1])
def random_choose(ori_list, num, seed=None, sort = True, split = False):
'''
本函数用于从一个序列中随机选取数个元素,对于有序序列可保留原顺序
[ori_list](list/set/..): 原序列
[num](int): 选取的个数
[seed](int): 可选用不同种子
[sort](bool): 是否保留原顺序(默认为是)(需提高效率时可设置为False)
[split](bool): 是否同时返回新列表与选择完毕后剩下的列表(缺省为否)(非常有用)
'''
new_list = []
if type(ori_list) != type(new_list):
ori_list = list(ori_list)
pipe_list = list(ori_list)
length = len(ori_list)
i = 0
while i < num:
index = seed_random([0, length-1], seed)
new_list.append(pipe_list.pop(index))
i+=1
length -= 1
seed += 1
# if not i%10000:
# print(str(int(i/10000))+' choosen')
if sort:
new_list.sort(key=ori_list.index)
if split:
pipe_list.sort(key=ori_list.index)
if split:
return new_list, pipe_list
else:
return new_list