今天下午,成长群的群主申总提出,群里每个人找一个战友,互帮互助。一石激起千层浪,群里面积极向上好青年们就开始踊跃自我介绍,一个比一个优秀,让人羡慕不已。我正想要参与其中,突然想到我的活学活用系列需要更新了。没有困难,创造困难也要上。于是,仔细想一想,可能出现几种情况:
- 有些人不好意思在群里公开自己的个人信息,不发自我介绍
- 有些人发了自我介绍,但是没有人对他的行业或者爱好感兴趣,没人跟他结盟
- 有些人发了自我介绍,对他感兴趣的人很多,都想要跟他结盟,做选择可能会麻烦
如果用Python来随机配对,能解决上面的问题。还有一个好处,每个月初,有了新的成员加进来之后,可以重新打乱配对一次,这样每个月都会有一个新的战友配对,就可以结交一个新朋友,岂不更好。
我的想法是:
把全体群成员放在一个集合里面,然后随机的从这个集合中挑出两个元素,作为一对战友,然后把这俩哥们从集合中删除,剩下的成员组成了新的集合,再对新的集合重复上面的操作,一直到新的集合为空,程序结束
Python实现
数据存放
在Python中可以用list或者set来实现
set和list的区别如下:
set是无序的,不可重复的
list是有序的,可以重复的
set实现
直觉上set比较适合,于是查看set的文档,看有没有适合的操作函数。发现set的操作函数有5个:
add(elem)
Add element elem to the set.
remove(elem)
Remove element elem from the set. Raises KeyError if elem is not contained in the set.
discard(elem)
Remove element elem from the set if it is present.
pop()
Remove and return an arbitrary element from the set. Raises KeyError if the set is empty.
clear()
Remove all elements from the set.
来源: https://docs.python.org/3/library/stdtypes.html?highlight=set#set
其中pop()从集合中删除并返回随机的一个元素,好像很符合我的要求,于是动手尝试。
members = {'a','b','c','d','e','f','g','h','i','j','k'}
def comrade(members):
print(members.pop(),end='')
print('和',end='')
print(members.pop())
try:
while len(members)>0:
comrade(members)
except KeyError:
print('\n成员有单数个,最终一个成员没有战友')
输入的结果如下:
h和e
c和j
b和a
i和k
f和g
d和
成员有单数个,最终一个成员没有战友
成功了O(∩_∩)O哈哈~
PS:因为可能存在成员数为单数的情况,为了不使程序出错,这里添加了一个try-except
list实现
上面是用set实现的,那用list能实现吗?
答案是:可以
查看Python文档,发现一个函数非常适合:random.shuffle,这个家伙能把一个list中的成员洗牌打乱,那么我们就可以按照顺序把大乱以后的list中的成员打印出来,挨着的两个成员就成为战友。实现如下:
import random
members = ['a','b','c','d','e','f','g','h','i','j','k']
random.shuffle(members)
d= list(range(0,len(members),2))
for i in d:
print(members[i:i+2])
输入的结果如下:
['g', 'f']
['h', 'e']
['a', 'b']
['d', 'k']
['i', 'c']
['j']
成功,而且不会因为单数问题报错,实现起来也比set简单,更重要的一点是程序运行后生成了一个雷暴members保存了所有的战友匹配信息。方便保存。
这里有个知识点是list的切片,list[i:j]返回的是一个小list,是原来list的第i个元素到第j个元素。
应用
如果要应用到群成员配对,只需要把members的内容替换成为愿意程序配对的群成员们就可以啦
小结
set创建和pop()函数
list创建,list切片
random.shuffle(list)给list洗牌