python学习第四节:friendbook(综合应用list,dict,tuple等)

课程视频链接

跟着麦叔学Python:https://b23.tv/Xx9NV0

1. 主程序 friend.py

from cmd import *

def print_usage():
	print("欢迎使用FriendBook,您可以输入以下命令:")
	print("list: 显示名单")
	print("张三:查询张三的情况,李四同理")
	print("886: 退出")

print_usage()

while(True):
	cmd = input('请输入命令:')
	if(cmd == '886'):
		print("再见啦...")
		break
	elif(cmd == 'list'):
		show_list()
	elif(cmd.isdigit()):
		find_by_id(cmd)
	else:
		find(cmd)

2. 创建模拟数据程序

import random


xings_str = "李,王,张,刘,陈,杨,黄,赵,周,吴,徐,孙,朱,马,胡,郭,林,何,高,梁,郑,罗,宋,谢,唐,韩,曹,许,邓,萧,冯,曾,程,蔡,彭,潘,袁,于,董,余,苏,叶,吕,魏,蒋,田,杜,丁,沈,姜,范,江,傅,钟,卢,汪,戴,崔,任,陆,廖,姚,方,金,邱,夏,谭,韦,贾,邹,石,熊,孟,秦,阎,薛,侯,雷,白,龙,段,郝,孔,邵,史,毛,常,万,顾,赖,武,康,贺,严,尹,钱,施,牛,洪,龚"
mings_str = "大,二,三,四,五,六,七,八,九"
add_score_things = "点赞,赞美,投币,充电,打电话,帮助,送礼物"
reduce_score_things = "骂,打,欺骗,白嫖,要挟"

names = [] # [(1,张三),(2,王五)]
records = [((1, '张三'), '骂', (2, '李四'), -1)]  # 张三 骂了 李四 减1分;王五 请吃饭 马六 加1分
name_dict = {} # {id:张三}
record_dict = {} # {933:[()]}
score_dict = {} # {张三:[(李四,3),(王五,9)]}

def mock_names():
    xings = xings_str.split(",")
    mings = mings_str.split(",")
    for i in range(100):
        xing = random.choice(xings)
        ming = random.choice(mings)
        names.append((i+1, xing+ming))
    return names # [(1,张三),(2,王五)]
 

def mock_records():
    good_things = add_score_things.split(",")
    bad_things = reduce_score_things.split(",")
    things = good_things + bad_things
    for i in range(1000000):
        n1 = random.choice(names)
        n2 = random.choice(names)
        thing = random.choice(things)
        if(things.index(thing) >= len(good_things)):
            score = -1
        else:
            score = 1
        records.append((n1, thing, n2, score))
    return records # 张三 骂了 李四 减1分;王五 请吃饭 马六 加1分


def build_record_dict():
    for r in records:
        id = r[2][0]
        if id in record_dict:
            my_records = record_dict[id]  #不等于复制,复制是 = [:] ,这里只是引用,地址还是相同的
            my_records.append(r)  # 只是一个引用,实际上是新加到了字典里面
        else:
            record_dict[id] = [r]  # 新建一个列表list,把r放进去
    return record_dict  # {933:[()]}


def build_name_dict():
    for n in names:
        name_dict[n[0]] = n[1]
    return name_dict  # {id:张三}


def build_scores():
    for r in records: # 王五 打了 李四 -1
        account_id = r[2][0]  # 李四的id
        actioner_id = r[0][0] # 王五的id
        if account_id in score_dict:
            scores = score_dict[account_id] #{}
            if actioner_id in scores:
                scores[actioner_id] += r[3] # 加上相应分数
            else:
                scores[actioner_id] = r[3]
        else:
            score_dict[account_id] = {actioner_id:r[3]}
    for id in score_dict:  #按分数从高到低排序
        scores = score_dict[id] # {}
        sorted_scores  = sorted(scores.items(), key=lambda item: item[1]) #这里把无序字典变成了有序列表,分数从高到低
        score_dict[id] = sorted_scores  
    return score_dict  # {张三:[(李四,3),(王五,9)]}

def mock_data():
    print("mocking data")
    names = mock_names()
    records = mock_records()
    record_dict = build_record_dict()
    name_dict = build_name_dict()
    score_dict = build_scores()
    print("finished mock")
    return names, records, record_dict, name_dict, score_dict

3. 定义函数程序

from friend_data import *


names, records, record_dict, name_dict, score_dict = mock_data()

def show_list():
    for n in names:
        print("{}. {}".format(n[0], n[1]))

def show_records(id):
    # find_records = [r for r in records if r[2][0] == id]
    find_records = record_dict[id]
    for r in find_records:
        print("{}({}) 给我 {} {}".format(r[0][1], r[0][0], r[1], r[3]))


def show_summary(id):
    print("===== 红名单 =====")
    scores = score_dict[id] # {}
    for sid in scores[-1:-6:-1]:  # 只显示分数最高的5个人
        print("{} {}: {}".format(sid[0], name_dict[sid[0]], sid[1]))

def show_one(person):
    print("{}. {}".format(person[0], person[1]))
    # show_records(person[0])
    show_summary(person[0])


def find_by_id(id):
    person_id = [n for n in names if n[0] == int(id)]
    if(len(person_id) == 0):
        print("无效的ID{}".format(id))
    else:
        person = person_id[0]
        show_one(person)

def find(name):
    find_names = [n for n in names if n[1]==name] # 是list[]
    count = len(find_names)
    if(count == 0):
        print("不存在:{}".format(name))
    elif(count > 1):
        for n in find_names:
            print("{}. {}".format(n[0], n[1]))
        print("有多个{},请输入id选择具体的人".format(name))
    else:
        show_one(find_names[0])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值