set python比较随机_活学活用Python03:群成员随机两人配对

今天下午,成长群的群主申总提出,群里每个人找一个战友,互帮互助。一石激起千层浪,群里面积极向上好青年们就开始踊跃自我介绍,一个比一个优秀,让人羡慕不已。我正想要参与其中,突然想到我的活学活用系列需要更新了。没有困难,创造困难也要上。于是,仔细想一想,可能出现几种情况:

有些人不好意思在群里公开自己的个人信息,不发自我介绍

有些人发了自我介绍,但是没有人对他的行业或者爱好感兴趣,没人跟他结盟

有些人发了自我介绍,对他感兴趣的人很多,都想要跟他结盟,做选择可能会麻烦

如果用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洗牌

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值