cm-picker 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cm_picker-1.0.0/PKG-INFO +48 -0
- cm_picker-1.0.0/README.md +26 -0
- cm_picker-1.0.0/cm_picker/__init__.py +24 -0
- cm_picker-1.0.0/cm_picker/core.py +96 -0
- cm_picker-1.0.0/cm_picker.egg-info/PKG-INFO +48 -0
- cm_picker-1.0.0/cm_picker.egg-info/SOURCES.txt +8 -0
- cm_picker-1.0.0/cm_picker.egg-info/dependency_links.txt +1 -0
- cm_picker-1.0.0/cm_picker.egg-info/top_level.txt +1 -0
- cm_picker-1.0.0/setup.cfg +4 -0
- cm_picker-1.0.0/setup.py +21 -0
cm_picker-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cm_picker
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: 计算概论C课程课堂随机点名、分组、抽奖和座位表工具
|
|
5
|
+
Author: Chen Mo
|
|
6
|
+
Author-email: chenmoemail@126.com
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
9
|
+
Classifier: Operating System :: OS Independent
|
|
10
|
+
Classifier: Natural Language :: Chinese (Simplified)
|
|
11
|
+
Classifier: Intended Audience :: Education
|
|
12
|
+
Classifier: Topic :: Education
|
|
13
|
+
Requires-Python: >=3.8
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
Dynamic: author
|
|
16
|
+
Dynamic: author-email
|
|
17
|
+
Dynamic: classifier
|
|
18
|
+
Dynamic: description
|
|
19
|
+
Dynamic: description-content-type
|
|
20
|
+
Dynamic: requires-python
|
|
21
|
+
Dynamic: summary
|
|
22
|
+
|
|
23
|
+
# cm_picker
|
|
24
|
+
|
|
25
|
+
《计算概论C》课堂随机点名、分组、抽奖和座位表工具。
|
|
26
|
+
|
|
27
|
+
## 安装
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pip install cm_picker
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 示例
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
import cm_picker
|
|
37
|
+
|
|
38
|
+
names = ['张三', '李四', '王五', '赵六', '钱七', '孙八']
|
|
39
|
+
|
|
40
|
+
print(cm_picker.pick_one(names))
|
|
41
|
+
print(cm_picker.group_by_count(names, 2))
|
|
42
|
+
print(cm_picker.lucky_draw(names, ['一等奖', '二等奖']))
|
|
43
|
+
|
|
44
|
+
chart = cm_picker.make_exam_seating_chart(names, rows=2, cols=3)
|
|
45
|
+
cm_picker.save_result(chart, '座位表.csv')
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
这个库适合在学完列表、随机数、循环之后使用。库负责随机策略和表格保存,学生仍然需要自己准备名单、设计交互和展示结果。
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# cm_picker
|
|
2
|
+
|
|
3
|
+
《计算概论C》课堂随机点名、分组、抽奖和座位表工具。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install cm_picker
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 示例
|
|
12
|
+
|
|
13
|
+
```python
|
|
14
|
+
import cm_picker
|
|
15
|
+
|
|
16
|
+
names = ['张三', '李四', '王五', '赵六', '钱七', '孙八']
|
|
17
|
+
|
|
18
|
+
print(cm_picker.pick_one(names))
|
|
19
|
+
print(cm_picker.group_by_count(names, 2))
|
|
20
|
+
print(cm_picker.lucky_draw(names, ['一等奖', '二等奖']))
|
|
21
|
+
|
|
22
|
+
chart = cm_picker.make_exam_seating_chart(names, rows=2, cols=3)
|
|
23
|
+
cm_picker.save_result(chart, '座位表.csv')
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
这个库适合在学完列表、随机数、循环之后使用。库负责随机策略和表格保存,学生仍然需要自己准备名单、设计交互和展示结果。
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""cm_picker - 课堂随机点名、分组、抽奖和座位表工具。"""
|
|
2
|
+
|
|
3
|
+
from .core import (
|
|
4
|
+
pick_one,
|
|
5
|
+
pick_many,
|
|
6
|
+
group_by_size,
|
|
7
|
+
group_by_count,
|
|
8
|
+
lucky_draw,
|
|
9
|
+
make_seating_chart,
|
|
10
|
+
make_exam_seating_chart,
|
|
11
|
+
save_result,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__version__ = '1.0.0'
|
|
15
|
+
__all__ = [
|
|
16
|
+
'pick_one',
|
|
17
|
+
'pick_many',
|
|
18
|
+
'group_by_size',
|
|
19
|
+
'group_by_count',
|
|
20
|
+
'lucky_draw',
|
|
21
|
+
'make_seating_chart',
|
|
22
|
+
'make_exam_seating_chart',
|
|
23
|
+
'save_result',
|
|
24
|
+
]
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import csv
|
|
2
|
+
import random
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def _clean_names(names):
|
|
7
|
+
result = [str(name).strip() for name in names if str(name).strip()]
|
|
8
|
+
if not result:
|
|
9
|
+
raise ValueError('名单不能为空')
|
|
10
|
+
return result
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def pick_one(names):
|
|
14
|
+
"""从名单中随机抽取 1 人。"""
|
|
15
|
+
return random.choice(_clean_names(names))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def pick_many(names, k, repeat=False):
|
|
19
|
+
"""从名单中抽取 k 人。repeat=True 时允许重复抽取。"""
|
|
20
|
+
names = _clean_names(names)
|
|
21
|
+
if k < 0:
|
|
22
|
+
raise ValueError('k 不能小于 0')
|
|
23
|
+
if repeat:
|
|
24
|
+
return random.choices(names, k=k)
|
|
25
|
+
if k > len(names):
|
|
26
|
+
raise ValueError('不重复抽取时,k 不能大于名单人数')
|
|
27
|
+
return random.sample(names, k)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def group_by_size(names, size):
|
|
31
|
+
"""按照每组 size 人随机分组。最后一组可能人数较少。"""
|
|
32
|
+
if size <= 0:
|
|
33
|
+
raise ValueError('每组人数必须大于 0')
|
|
34
|
+
names = _clean_names(names)
|
|
35
|
+
random.shuffle(names)
|
|
36
|
+
return [names[i:i + size] for i in range(0, len(names), size)]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def group_by_count(names, count):
|
|
40
|
+
"""把名单随机分成 count 组,人数尽量均衡。"""
|
|
41
|
+
if count <= 0:
|
|
42
|
+
raise ValueError('组数必须大于 0')
|
|
43
|
+
names = _clean_names(names)
|
|
44
|
+
random.shuffle(names)
|
|
45
|
+
groups = [[] for _ in range(count)]
|
|
46
|
+
for index, name in enumerate(names):
|
|
47
|
+
groups[index % count].append(name)
|
|
48
|
+
return groups
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def lucky_draw(names, prizes):
|
|
52
|
+
"""根据奖品列表抽奖,返回 [(奖品, 获奖人), ...]。"""
|
|
53
|
+
names = _clean_names(names)
|
|
54
|
+
prizes = [str(prize).strip() for prize in prizes if str(prize).strip()]
|
|
55
|
+
if len(prizes) > len(names):
|
|
56
|
+
raise ValueError('奖品数量不能多于参与人数')
|
|
57
|
+
winners = random.sample(names, len(prizes))
|
|
58
|
+
return list(zip(prizes, winners))
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def make_seating_chart(names, rows, cols, empty=''):
|
|
62
|
+
"""生成普通座位表,返回二维列表。"""
|
|
63
|
+
if rows <= 0 or cols <= 0:
|
|
64
|
+
raise ValueError('行数和列数必须大于 0')
|
|
65
|
+
names = _clean_names(names)
|
|
66
|
+
if len(names) > rows * cols:
|
|
67
|
+
raise ValueError('座位数不够')
|
|
68
|
+
random.shuffle(names)
|
|
69
|
+
seats = names + [empty] * (rows * cols - len(names))
|
|
70
|
+
return [seats[i * cols:(i + 1) * cols] for i in range(rows)]
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def make_exam_seating_chart(names, rows, cols, empty='', snake=True):
|
|
74
|
+
"""生成考试座位表。snake=True 时相邻行方向相反,便于打印查看。"""
|
|
75
|
+
chart = make_seating_chart(names, rows, cols, empty=empty)
|
|
76
|
+
if snake:
|
|
77
|
+
return [row if i % 2 == 0 else list(reversed(row)) for i, row in enumerate(chart)]
|
|
78
|
+
return chart
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def save_result(result, filename):
|
|
82
|
+
"""把分组、抽奖或座位表保存为 CSV 文件。"""
|
|
83
|
+
path = Path(filename)
|
|
84
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
85
|
+
with path.open('w', encoding='utf-8-sig', newline='') as f:
|
|
86
|
+
writer = csv.writer(f)
|
|
87
|
+
if not result:
|
|
88
|
+
return str(path)
|
|
89
|
+
first = result[0]
|
|
90
|
+
if isinstance(first, tuple):
|
|
91
|
+
writer.writerows(result)
|
|
92
|
+
elif isinstance(first, list):
|
|
93
|
+
writer.writerows(result)
|
|
94
|
+
else:
|
|
95
|
+
writer.writerow(result)
|
|
96
|
+
return str(path)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cm_picker
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: 计算概论C课程课堂随机点名、分组、抽奖和座位表工具
|
|
5
|
+
Author: Chen Mo
|
|
6
|
+
Author-email: chenmoemail@126.com
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
9
|
+
Classifier: Operating System :: OS Independent
|
|
10
|
+
Classifier: Natural Language :: Chinese (Simplified)
|
|
11
|
+
Classifier: Intended Audience :: Education
|
|
12
|
+
Classifier: Topic :: Education
|
|
13
|
+
Requires-Python: >=3.8
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
Dynamic: author
|
|
16
|
+
Dynamic: author-email
|
|
17
|
+
Dynamic: classifier
|
|
18
|
+
Dynamic: description
|
|
19
|
+
Dynamic: description-content-type
|
|
20
|
+
Dynamic: requires-python
|
|
21
|
+
Dynamic: summary
|
|
22
|
+
|
|
23
|
+
# cm_picker
|
|
24
|
+
|
|
25
|
+
《计算概论C》课堂随机点名、分组、抽奖和座位表工具。
|
|
26
|
+
|
|
27
|
+
## 安装
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pip install cm_picker
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 示例
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
import cm_picker
|
|
37
|
+
|
|
38
|
+
names = ['张三', '李四', '王五', '赵六', '钱七', '孙八']
|
|
39
|
+
|
|
40
|
+
print(cm_picker.pick_one(names))
|
|
41
|
+
print(cm_picker.group_by_count(names, 2))
|
|
42
|
+
print(cm_picker.lucky_draw(names, ['一等奖', '二等奖']))
|
|
43
|
+
|
|
44
|
+
chart = cm_picker.make_exam_seating_chart(names, rows=2, cols=3)
|
|
45
|
+
cm_picker.save_result(chart, '座位表.csv')
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
这个库适合在学完列表、随机数、循环之后使用。库负责随机策略和表格保存,学生仍然需要自己准备名单、设计交互和展示结果。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cm_picker
|
cm_picker-1.0.0/setup.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from setuptools import setup, find_packages
|
|
2
|
+
|
|
3
|
+
setup(
|
|
4
|
+
name='cm_picker',
|
|
5
|
+
version='1.0.0',
|
|
6
|
+
author='Chen Mo',
|
|
7
|
+
author_email='chenmoemail@126.com',
|
|
8
|
+
description='计算概论C课程课堂随机点名、分组、抽奖和座位表工具',
|
|
9
|
+
long_description=open('README.md', encoding='utf-8').read(),
|
|
10
|
+
long_description_content_type='text/markdown',
|
|
11
|
+
packages=find_packages(),
|
|
12
|
+
python_requires='>=3.8',
|
|
13
|
+
classifiers=[
|
|
14
|
+
'Programming Language :: Python :: 3',
|
|
15
|
+
'License :: OSI Approved :: MIT License',
|
|
16
|
+
'Operating System :: OS Independent',
|
|
17
|
+
'Natural Language :: Chinese (Simplified)',
|
|
18
|
+
'Intended Audience :: Education',
|
|
19
|
+
'Topic :: Education',
|
|
20
|
+
],
|
|
21
|
+
)
|