-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgenUltils.py
More file actions
292 lines (233 loc) · 12.1 KB
/
genUltils.py
File metadata and controls
292 lines (233 loc) · 12.1 KB
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
import random
import string
import datetime
#### Example Random
# random.random() # Số thực ngẫu nhiên trong khoảng [0.0, 1.0)
# random.uniform(10, 20) # Số thực trong khoảng [10, 20]
# random.randint(1, 100) # Số nguyên trong khoảng [1, 100]
# random.randrange(1, 100, 2) # Số nguyên lẻ từ 1 đến 99
# random.shuffle(numbers) # Xáo trộn danh sách
############## RANDOM 1 GIÁ TRỊ ##############
def randomInList(items, numberOfItems=1, duplicate=0):
"""
Hàm chọn ngẫu nhiên một hoặc nhiều phần tử từ danh sách cho trước.
Tham số:
- items: Danh sách các phần tử có thể chọn.
- numberOfItems: Số lượng phần tử cần lấy (mặc định là 1).
- duplicate:
+ Nếu duplicate = 0 (mặc định): Không cho phép trùng lặp (sử dụng random.sample).
+ Nếu duplicate ≠ 0: Cho phép trùng lặp (sử dụng random.choices).
Ví dụ:
items = ["A", "B", "C", "D"]
randomInList(items, 2, 0) # Lấy 2 phần tử không trùng
randomInList(items, 3, 1) # Lấy 3 phần tử có thể trùng lặp
"""
if duplicate == 0:
# Sử dụng random.sample để lấy các phần tử không trùng lặp
return random.sample(items, numberOfItems)
else:
# Sử dụng random.choices để lấy các phần tử có thể trùng lặp
return random.choices(items, k=numberOfItems)
def randomDate(minYear, maxYear):
"""
Sinh một ngày ngẫu nhiên trong khoảng minYear đến maxYear.
"""
year = random.randint(minYear, maxYear)
month = random.randint(1, 12)
# Chọn ngày hợp lệ theo tháng/năm
maxDay = (datetime.date(year, month % 12 + 1, 1) - datetime.timedelta(days=1)).day
day = random.randint(1, maxDay)
return (day, month, year)
def randomString(length, useSpace=True, useUpper=True, useLower=True, useSpecial=False):
"""
Hàm randomString sinh chuỗi ngẫu nhiên với các tùy chọn:
- length (int): Độ dài chuỗi cần sinh.
- useSpace (bool, mặc định=True): Cho phép dấu cách hay không.
- useUpper (bool, mặc định=True): Cho phép chữ hoa hay không.
- useLower (bool, mặc định=True): Cho phép chữ thường hay không.
- useSpecial (bool, mặc định=False): Cho phép ký tự đặc biệt (!@#$%^&*...) hay không.
Returns:
- str: Chuỗi ngẫu nhiên theo yêu cầu.
Ví dụ:
randomString(10) # Chuỗi 10 ký tự có khoảng trắng, chữ hoa, chữ thường.
randomString(8, useSpace=False) # Chuỗi 8 ký tự không có dấu cách.
randomString(12, useSpecial=True) # Chuỗi 12 ký tự có ký tự đặc biệt.
randomString(15, useLower=False) # Chuỗi 15 ký tự chỉ có chữ hoa và khoảng trắng.
"""
charPool = ""
if useLower:
charPool += string.ascii_lowercase # a-z
if useUpper:
charPool += string.ascii_uppercase # A-Z
if useSpecial:
charPool += string.punctuation # !@#$%^&*()_+...
if useSpace:
charPool += " " # Dấu cách
if not charPool:
raise ValueError("Phải chọn ít nhất một loại ký tự!")
return "".join(random.choices(charPool, k=length))
def randomStringFromChars(length, options, allowDuplicates=True):
"""
Sinh một chuỗi ngẫu nhiên với các ký tự thuộc danh sách options.
- length: Độ dài chuỗi cần tạo.
- options: Danh sách các ký tự hợp lệ.
- allowDuplicates: Cho phép trùng lặp ký tự hay không.
Nếu allowDuplicates=False và length > len(options), sẽ báo lỗi.
"""
if not allowDuplicates and length > len(options):
raise ValueError("Không thể tạo chuỗi không trùng với số lượng lớn hơn danh sách ký tự")
return "".join(random.choices(options, k=length)) if allowDuplicates else "".join(random.sample(options, length))
############## RANDOM 1 LIST ##############
def randomIntList(size, minVal, maxVal, allowDuplicates=True, sortOrder=None):
"""
Hàm randomList sinh list số nguyên có đầy đủ các tùy chọn:
- size: Số lượng phần tử trong danh sách.
- minVal, maxVal: Giá trị nhỏ nhất và lớn nhất.
- allowDuplicates (bool, mặc định=True): Cho phép trùng lặp hay không.
- sortOrder: Kiểu sắp xếp (None - không sắp xếp, "asc" - tăng dần, "desc" - giảm dần).
Returns:
- List[int]: Danh sách số nguyên ngẫu nhiên theo yêu cầu.
Ví dụ:
randomList(5, 1, 10) # Ngẫu nhiên, có thể trùng
randomList(5, 1, 10, False) # Ngẫu nhiên, không trùng
randomList(5, 1, 10, allowDuplicates=False, sortOrder="desc") # Ngẫu nhiên, không trùng, giảm dần
randomList(5, 1, 10, sort_order="asc") # Ngẫu nhiên, có thể trùng, tăng dần
"""
if allowDuplicates:
lst = [random.randint(minVal, maxVal) for _ in range(size)]
else:
if maxVal - minVal + 1 < size:
raise ValueError("Khoảng giá trị không đủ để tạo danh sách không trùng lặp")
lst = random.sample(range(minVal, maxVal + 1), size)
# Sắp xếp nếu cần
if sortOrder == "asc":
lst.sort()
elif sortOrder == "desc":
lst.sort(reverse=True)
return lst
def randomFloatList(size, minVal, maxVal, allowDuplicates=True, sortOrder=None, precision=2):
"""
Hàm randomFloatList sinh list số thực có đầy đủ các tùy chọn:
- size (int): Số lượng phần tử trong danh sách.
- minVal, maxVal: Giá trị nhỏ nhất và lớn nhất.
- allowDuplicates (bool, mặc định=True): Cho phép trùng lặp hay không.
- sortOrder (str, mặc định=None): Kiểu sắp xếp kết quả ("asc" - tăng dần, "desc" - giảm dần, None - không sắp xếp).
- precision (int, mặc định=2): Số chữ số sau dấu thập phân.
Returns:
- List[float]: Danh sách số thực ngẫu nhiên theo yêu cầu.
Ví dụ:
randomFloatList(5, 1.0, 10.0) # Ngẫu nhiên, có thể trùng
randomFloatList(5, 1.0, 10.0, False) # Ngẫu nhiên, không trùng
randomFloatList(5, 1.0, 10.0, allowDuplicates=False, sortOrder="desc") # Ngẫu nhiên, không trùng, giảm dần
randomFloatList(5, 1.0, 10.0, sortOrder="asc", precision=3) # Ngẫu nhiên, có thể trùng, tăng dần, 3 chữ số thập phân
"""
if allowDuplicates:
# Nếu cho phép trùng lặp, chọn ngẫu nhiên số thực với số chữ số thập phân được chỉ định
lst = [round(random.uniform(minVal, maxVal), precision) for _ in range(size)]
else:
# Nếu không cho phép trùng lặp, cần sinh các giá trị không trùng
uniqueValues = set()
while len(uniqueValues) < size:
uniqueValues.add(round(random.uniform(minVal, maxVal), precision))
lst = list(uniqueValues)
# Sắp xếp danh sách nếu cần
if sortOrder == "asc":
lst.sort()
elif sortOrder == "desc":
lst.sort(reverse=True)
return lst
def randomStringList(size, maxLen, useSpace=True, useUpper=True, useLower=True, useSpecial=False, minStrLen=1):
"""
Sinh danh sách `size` chuỗi ngẫu nhiên sao cho tổng độ dài <= `maxLen`.
- size (int): Số lượng phần tử trong danh sách.
- maxLen (int): Tổng độ dài tối đa của tất cả chuỗi trong danh sách.
- minStrLen (int, mặc định=1): Độ dài tối thiểu của mỗi chuỗi.
- Các tùy chọn khác giống như `randomString`.
Returns:
- list: Danh sách `size` chuỗi ngẫu nhiên.
"""
if minStrLen * size > maxLen:
raise ValueError("Không thể tạo danh sách thỏa mãn điều kiện (tối thiểu quá lớn so với maxLen)")
remainingLen = maxLen # Tổng số ký tự còn lại có thể sử dụng
result = []
for i in range(size):
maxStrLen = remainingLen - (size - len(result) - 1) * minStrLen # Giữ đủ ký tự cho phần còn lại
strLen = random.randint(minStrLen, maxStrLen) # Chọn độ dài hợp lệ
result.append(randomString(strLen, useSpace, useUpper, useLower, useSpecial))
remainingLen -= strLen # Giảm phần còn lại
return result
def randomListDate(size, minYear, maxYear, allowDuplicates=True, sortOrder=None):
"""
Sinh danh sách các ngày ngẫu nhiên.
- size: Số lượng phần tử.
- minYear, maxYear: Khoảng năm hợp lệ.
- allowDuplicates: Cho phép trùng lặp hay không.
- sortOrder: None (ngẫu nhiên), "asc" (tăng dần), "desc" (giảm dần).
"""
if not allowDuplicates and (maxYear - minYear + 1) * 365 < size:
raise ValueError("Khoảng ngày không đủ để tạo danh sách không trùng lặp!")
dateSet = set()
result = []
while len(result) < size:
newDate = randomDate(minYear, maxYear)
if allowDuplicates or newDate not in dateSet:
result.append(newDate)
dateSet.add(newDate)
# Sắp xếp danh sách nếu cần
if sortOrder == "asc":
result.sort(key=lambda d: (d[2], d[1], d[0])) # Sắp xếp theo (năm, tháng, ngày)
elif sortOrder == "desc":
result.sort(key=lambda d: (d[2], d[1], d[0]), reverse=True)
return result
############## ĐỊNH DẠNG ĐẦU RA CỦA DANH SÁCH ##############
def toStringLines(lst):
"""
Tạo một chuỗi từ danh sách lst, mỗi phần tử cách nhau một dòng.
- Nếu phần tử là số hoặc chuỗi, chuyển thành chuỗi và giữ nguyên.
- Nếu phần tử là danh sách con, các phần tử trong đó được ghép lại thành một dòng (cách nhau dấu cách).
- Toàn bộ danh sách được nối lại bằng dấu xuống dòng ("\n").
Ví dụ:
>>> toStringLines([1, [2, 3, 4], 5])
'1\n2 3 4\n5'
"""
result = []
for item in lst:
if isinstance(item, list): # Nếu phần tử là danh sách con
result.append(" ".join(map(str, item))) # Ghép thành một dòng
else:
result.append(str(item)) # Chuyển thành chuỗi
return "\n".join(result) # Ghép toàn bộ danh sách thành chuỗi với dấu xuống dòng
def toStringLinesAll(lst):
"""
Chuyển danh sách lst thành một chuỗi, mỗi phần tử cách nhau một dòng.
- Nếu phần tử là số hoặc chuỗi, giữ nguyên.
- Nếu phần tử là danh sách con, mỗi phần tử trong đó cũng xuống dòng riêng (đệ quy).
- Toàn bộ danh sách được nối lại bằng dấu xuống dòng ("\n").
Ví dụ:
>>> toStringLinesAll([1, [2, 3], 4, [5, [6, 7], 8]])
'1\n2\n3\n4\n5\n6\n7\n8'
"""
result = []
for item in lst:
if isinstance(item, list): # Nếu phần tử là danh sách con, xử lý đệ quy
result.append(toStringLinesAll(item)) # Gọi lại chính hàm này
else:
result.append(str(item)) # Chuyển thành chuỗi
return "\n".join(result) # Ghép tất cả phần tử thành chuỗi với dấu xuống dòng
def toStringSpace(lst):
"""
Tạo một chuỗi từ danh sách lst, mỗi phần tử cách nhau một dấu cách.
- Nếu phần tử là số hoặc chuỗi, giữ nguyên.
- Nếu phần tử là danh sách con, các phần tử bên trong được nối lại bằng dấu cách.
- Toàn bộ danh sách được nối lại thành một chuỗi trên một dòng.
Ví dụ:
>>> toStringSpace([1, [2, 3, 4], 5])
'1 2 3 4 5'
"""
result = []
for item in lst:
if isinstance(item, list): # Nếu phần tử là danh sách con
result.append(" ".join(map(str, item))) # Ghép tất cả phần tử con thành một chuỗi
else:
result.append(str(item)) # Chuyển thành chuỗi
return " ".join(result) # Ghép toàn bộ danh sách thành chuỗi với dấu cách