活学活用Python03:群成员随机两人配对

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

  1. 有些人不好意思在群里公开自己的个人信息,不发自我介绍
  2. 有些人发了自我介绍,但是没有人对他的行业或者爱好感兴趣,没人跟他结盟
  3. 有些人发了自我介绍,对他感兴趣的人很多,都想要跟他结盟,做选择可能会麻烦

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,738评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,377评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,774评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,032评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,015评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,239评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,724评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,374评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,410评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,457评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,132评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,733评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,804评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,022评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,515评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,116评论 2 341

推荐阅读更多精彩内容