请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
123
返回列表 发新帖
楼主: crossin

【每周一坑】3道题

[复制链接]

3

主题

1

好友

111

积分

注册会员

Rank: 2

发表于 2021-2-9 19:56:34 |显示全部楼层
  1. import re

  2. def fangfa(text_):
  3.     text = re.findall(r'.',text_)
  4.     #  print(text)
  5.     keylist = set(text)
  6.     #  print(keylist)
  7.     dic = {}
  8.     for keylists in keylist:
  9.         dic[keylists] = 0
  10.     for texts in text:
  11.         if texts in keylist:
  12.             dic[texts] += 1
  13.     #  print(dic)
  14.     sortext = sorted(dic.items(), key=lambda l: l[1], reverse = True)
  15.     for sortexts in sortext:
  16.         print(sortexts[0] + ':' + str(sortexts[1]))
  17.         
  18. fangfa('History is his story')
复制代码
希望老师还能看到

不知道我这样行不行

渴望老师的建议和意见
(比如说哪里太繁琐了、可以更简洁,或者哪里不够合理、可以更有逻辑)

谢谢各位老师
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2021-2-10 17:00:45 |显示全部楼层
FERRYMAN 发表于 2021-2-9 19:56
希望老师还能看到

不知道我这样行不行

没必要用正则,直接字符转列表即可
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

3

主题

1

好友

111

积分

注册会员

Rank: 2

发表于 2021-2-10 17:16:14 |显示全部楼层
crossin先生 发表于 2021-2-10 17:00
没必要用正则,直接字符转列表即可

好的,谢谢老师
回复

使用道具 举报

3

主题

1

好友

111

积分

注册会员

Rank: 2

发表于 2021-2-14 18:15:13 |显示全部楼层
第二题

希望老师能看看

有一个问题(不知道是不是我多虑了):如果有某些用户心血来潮,押注的是一些奇奇怪怪的东西,刚好又不会被while检测到,那该怎么解决呢?

谢谢老师啦
  1. import random

  2. my_score = 100
  3. com_score = 100

  4. yx_rule = "游戏规则:\n双方玩家分别为真人和电脑,初始分数均为100.\n"
  5. yx_rule += "有3个6面骰子,可以掷出总和为3~18的数,其中3~10为'small',11~18为'big',总和为实际数字.\n"
  6. yx_rule += "游戏开始后可押'big'或'small',或3~18中的数字(最多5个),也可同时押大小和数字.\n"
  7. yx_rule += "双方玩家的计分制度相同:押中大小,加分数为实际数字的两倍;押中数字,加分数为实际数字的10倍;\n"
  8. yx_rule += "同样存在扣分机制:若押了超过2个数字,扣分数为 (押注中的数字个数 - 2)* (实际数字的2倍)."
  9. print(yx_rule)
  10. print('\nOK!游戏开始啰!\n\n')

  11. active = True  #使用变量作为循环条件便于后面退出循环
  12. while active == True:
  13.     input_w = "请押注:\n您可以押'big''small'或3~18中的任意整数,或同时押注.\n"
  14.     input_w += "(最多押1个大小和3个不重复的数字.若同时押注,您需要用逗号分隔.)\n"
  15.     mb_input = input(input_w)
  16.     mb_num = []
  17.     mb_str = []
  18.     sy = []   #sy为不舍去的情况下的数字列,若sy长度大于mb_num,即可判断有不符合条件的数,并进入while循环
  19.     for a in mb_input.split(','):
  20.         if a.isnumeric():
  21.             sy.append(a)
  22.             if (int(a) > 18) or (int(a) < 3):  #若不符合条件将被舍去
  23.                 continue
  24.             mb_num.append(int(a))
  25.         elif a.isalpha():
  26.             mb_str.append(a)

  27.     while (len(set(mb_num)) < len(mb_num)) or (len(mb_num) > 5) or (len(mb_str) > 1) or (len(mb_num) < len(sy)):
  28.         mb_num = []
  29.         mb_str = []
  30.         sy = []
  31.         print("注意!最多押1个大小和3个不重复的数字(3~18)!重复押注要用逗号分隔!")
  32.         mb_input = input("请重新押注:")
  33.         for a in mb_input.split(','):
  34.             if a.isnumeric():
  35.                 sy.append(a)
  36.                 if (int(a) > 18) or (int(a) < 3):
  37.                     continue
  38.                 mb_num.append(int(a))
  39.             elif a.isalpha():
  40.                 mb_str.append(a)  #这一段和while前的那段基本相同
  41.     if mb_str:
  42.         mb_str = mb_str[0]
  43.     #以上为记录用户输入部分:得到所押大小&数字
  44.    
  45.     d_1 = random.randint(1,6)
  46.     d_2 = random.randint(1,6)
  47.     d_3 = random.randint(1,6)
  48.     #专门定义三个dice而不是直接random.randint(3,18),增加点儿真实感(?)
  49.     real_num = d_1 + d_2 + d_3
  50.     if d_1 + d_2 + d_3 <= 10:
  51.         real_str = 'small'
  52.     elif d_1 + d_2 + d_3 >= 11:
  53.         real_str = 'big'

  54.     if mb_str:
  55.         if mb_str == real_str:
  56.             my_score += real_num * 2
  57.     for mn in mb_num:
  58.         if mn == real_num:
  59.             my_score += real_num * 10
  60.             if len(mb_num) > 2:
  61.                 my_score -= (real_num * 2) * (len(mb_num) - 2)
  62.     if (real_num not in mb_num) and (len(mb_num) > 2):
  63.         my_score -= (real_num * 2) * (len(mb_num) - 2)

  64.     com_str = random.choice(['big','small'])
  65.     com_num = random.randint(3,18)
  66.     if com_str == real_str:
  67.         com_score += real_num * 2
  68.     if com_num == real_num:
  69.         com_score += real_num * 10
  70.     #以上为后台判断部分

  71.     print('你押了: %s' % mb_input)
  72.     print('电脑玩家押了: %s,%d' % (com_str, com_num))
  73.     print('骰子分别掷出%d,%d,%d,实际数字为%d,实际大小为%s' % (d_1,d_2,d_3,real_num,real_str))
  74.     print('\n那么,您和电脑玩家的比分现在是: %d - %d' % (my_score, com_score))
  75.     #以上为输出结果部分
  76.    
  77.     b = 1  #先定义b以进入while循环
  78.     while b != '':   #防止玩家兴趣渐消
  79.         b = input("如果要结束游戏,请输入'quit'.要继续的话请按回车哦.\n")
  80.         if b == 'quit':
  81.             active = False
  82.             print('游戏结束,拜拜!')
  83.             break
  84.     #以上为判断是否结束游戏部分

复制代码
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2021-2-16 23:05:54 |显示全部楼层
FERRYMAN 发表于 2021-2-14 18:15
第二题

希望老师能看看

输出后加个if条件判断输入的内容是不是符合要求的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

3

主题

1

好友

111

积分

注册会员

Rank: 2

发表于 2021-2-17 11:16:45 |显示全部楼层
crossin先生 发表于 2021-2-16 23:05
输出后加个if条件判断输入的内容是不是符合要求的

哦!懂了。谢谢老师
回复

使用道具 举报

9

主题

2

好友

164

积分

注册会员

Rank: 2

发表于 2021-5-16 20:47:31 |显示全部楼层
本帖最后由 ZZZZZ 于 2021-5-16 20:48 编辑
  1. # 第一题
  2. s = input()
  3. d = {}
  4. for i in s:
  5.   if i != '':
  6.     if i in d:
  7.       d[i] += 1
  8.     else:
  9.       d[i] = 1
  10. for i in d:
  11.   print('%s: %d' % (i, d[i]))
复制代码
回复

使用道具 举报

0

主题

1

好友

21

积分

新手上路

Rank: 1

发表于 2021-7-6 17:26:38 |显示全部楼层
代码如下:
a=input('输入一段字,我能猜出这串字符里面每个字符出现的次数\n')
d={}
for b in a:
    d[b]=(a.count(b))
d_order=sorted(d.items(),key=lambda x:x[1],reverse=True)#排序
print(d_order)

运行结果如下:
[('s', 4), ('i', 3), (' ', 3), ('h', 2), ('t', 2), ('o', 2), ('r', 2), ('y', 2)]

但是怎么运行结果输出成如题的格式,我试了以下两种方式:
方式一:for key in d_order:
    print("{}:{}".format(key,d_order[key]))

报错如下:Traceback (most recent call last):
  File "C:/Users/duoduo520/AppData/Local/Programs/Python/Python39/ChacreterNumber3.py", line 9, in <module>
    print("{}:{}".format(key,d_order[key]))
TypeError: list indices must be integers or slices, not tuple
方式二:
for key in d_order:
     print(f'"{key}":{d_order[key]}')
报错如下:
Traceback (most recent call last):
  File "C:/Users/duoduo520/AppData/Local/Programs/Python/Python39/ChacreterNumber3.py", line 9, in <module>
    print(f'"{key}":{d_order[key]}')
TypeError: list indices must be integers or slices, not tuple

看了好长时间还是没明白,怎么修改,请crossin老师指导,谢谢!
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2021-7-6 19:44:08 |显示全部楼层
chinaso1111 发表于 2021-7-6 17:26
代码如下:
a=input('输入一段字,我能猜出这串字符里面每个字符出现的次数\n')
d={}

你代码中的d_order 是个列表,列表里面元素是元组。但是你的代码在把它当字典来处理,所以不对
  1. for elem in d_order:
  2.     print(elem[0], ':', elem[1])
复制代码
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

1

好友

21

积分

新手上路

Rank: 1

发表于 2021-7-7 12:42:17 |显示全部楼层
crossin先生 发表于 2021-7-6 19:44
你代码中的d_order 是个列表,列表里面元素是元组。但是你的代码在把它当字典来处理,所以不对 ...

谢谢crossin老师,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-3-29 01:26 , Processed in 0.018539 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部