鱼C论坛

 找回密码
 立即注册
查看: 3172|回复: 4

[已解决]字典的两个键对应的value值一样,我要怎么输出两个不同的key和value对?

[复制链接]
发表于 2021-4-22 22:42:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目是:

生成包含1000个随机字符的字符串,然后统计每个字符的出现次数。
要求:
1、利用random模块和string模块随机生成一个长度为1000由字符(包括英文字母,数字和标点符号)组成的字符串。
2、统计组成字符串的每个字符出现的次数,并将每个字符及其出现的次数保存在字典中。
要求用两种方式统计每个字符出现的次数:1)set+count;2)get方法
3、按每个字符出现的次数从大到小排序,并分行打印输出排在前五的每个字符及其出现的次数(从大到小)。
4、找到出现次数最多和最少的字符,打印输出出现次数最多和最少的字符及出现次数。

现在已经做到:
  1. import random
  2. import string
  3. x = string.ascii_letters + string.digits + string.punctuation
  4. y = [random.choice(x) for i in range(1000)]
  5. z = "".join(y)
  6. dict1 = dict()
  7. dict2 = dict()
  8. print('随机生成的字符是',z)
  9. a=''.join(set(z))
  10. print('字符数量是',len(a))
  11. #第一种统计方法
  12. for a in z :
  13.     dict1[a] = dict1.get(a, 0) + 1
  14. print(dict1)
  15. #第二种
  16. for a in z :
  17.     dict2.setdefault(a, 0)
  18.     dict2[a] += 1
  19. print(dict2)
  20. list1 = list(dict1.items())
  21. list1.sort(key=lambda x:x[1],reverse=True)
  22. print('从大到小是:',dict(list1))
  23. newdict=dict(zip(dict1.values(),dict1.keys()))
  24. def f(x) :
  25.     v1=sorted(dict1.values(),reverse=True)[x]
  26.     print(newdict.get(v1),v1)
  27.     return
  28. f(0)
  29. f(1)
  30. f(2)
  31. f(3)
  32. f(4)
  33. print("出现次数最多的是:['",newdict.get(sorted(dict1.values(),reverse=True)[0]),"']",sorted(dict1.values(),reverse=True)[0])
  34. print("出现次数最少的是:['",newdict.get(sorted(dict1.values(),reverse=True)[len(list1)-1]),"']",sorted(dict1.values(),reverse=True)[len(list1)-1])
复制代码




我是用了讲字典的value和key反过来,但是这样会覆盖掉一些相同的数据
我一开始想的是已知value值输出对应的key值,但是我做不到
后面我又想了一个办法,就是能不能在f(0)这一步之后,在原来的dict1中删除掉这个key-value对
然后我又失败了,希望论坛的大神能给出合适的解决方法!
感谢感谢,我只是一个大一的学生,希望大家给的意见或者方法可以让我听懂~
最佳答案
2021-4-23 08:58:43
你做的方法是有错误的,给你修改了。
  1. import random
  2. import string
  3. x = string.ascii_letters + string.digits + string.punctuation
  4. y = [random.choice(x) for i in range(1000)]

  5. ##z = "".join(y)

  6. dict1 = dict()
  7. dict2 = dict()
  8. print('随机生成的字符是',"".join(y))

  9. ##a=''.join(set(z))

  10. print('字符数量是',len(set(y)))

  11. #第一种统计方法  set + count
  12. for a in set(y) :
  13.     dict1[a] = y.count(a)
  14. print("第一种",dict1)

  15. #第二种 get方法
  16. for a in y :
  17.     dict2[a] = dict2.get(a, 0) + 1
  18. print("第二种",dict2)

  19. list1 = list(dict1.items())
  20. list1.sort(key=lambda x:x[1],reverse=True)
  21. print('从大到小是:',dict(list1))

  22. print("-"*20)
  23. print('前五:',dict(list1[:5]))
  24. maxstr = {}
  25. minstr = {}
  26. for i in dict1:
  27.     if dict1[i] == max(dict1.values()):
  28.         maxstr[i] = dict1[i]
  29.     if dict1[i] == min(dict1.values()):
  30.         minstr[i] = dict1[i]
  31. print("最多",maxstr)
  32. print("最少",minstr)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-4-23 08:58:43 | 显示全部楼层    本楼为最佳答案   
你做的方法是有错误的,给你修改了。
  1. import random
  2. import string
  3. x = string.ascii_letters + string.digits + string.punctuation
  4. y = [random.choice(x) for i in range(1000)]

  5. ##z = "".join(y)

  6. dict1 = dict()
  7. dict2 = dict()
  8. print('随机生成的字符是',"".join(y))

  9. ##a=''.join(set(z))

  10. print('字符数量是',len(set(y)))

  11. #第一种统计方法  set + count
  12. for a in set(y) :
  13.     dict1[a] = y.count(a)
  14. print("第一种",dict1)

  15. #第二种 get方法
  16. for a in y :
  17.     dict2[a] = dict2.get(a, 0) + 1
  18. print("第二种",dict2)

  19. list1 = list(dict1.items())
  20. list1.sort(key=lambda x:x[1],reverse=True)
  21. print('从大到小是:',dict(list1))

  22. print("-"*20)
  23. print('前五:',dict(list1[:5]))
  24. maxstr = {}
  25. minstr = {}
  26. for i in dict1:
  27.     if dict1[i] == max(dict1.values()):
  28.         maxstr[i] = dict1[i]
  29.     if dict1[i] == min(dict1.values()):
  30.         minstr[i] = dict1[i]
  31. print("最多",maxstr)
  32. print("最少",minstr)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-23 09:05:17 | 显示全部楼层
  1. import random
  2. import string

  3. def MakeRandom():
  4.     charactors = string.digits + string.ascii_letters + string.punctuation
  5.     result = [random.choice(charactors) for i in range(1000)]
  6.     return result


  7. def StringToDict(rs: str):
  8.     result = {}
  9.     for c in rs:
  10.         try:
  11.             result[c] += 1
  12.         except Exception:
  13.             result[c] = 1

  14.     return result


  15. def CountSort(d: dict):
  16.     d = sorted(d.items(), key=lambda x : x[1], reverse=True)
  17.     return d


  18. if __name__ == '__main__':
  19.     randomString = MakeRandom()
  20.     countDict = StringToDict(randomString)
  21.     countDict = CountSort(countDict)
  22.     print(countDict)
复制代码


字典的键是唯一的,值用来计数不就完事了么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-23 09:14:35 | 显示全部楼层
  1. import random
  2. import string
  3. x = string.ascii_letters + string.digits + string.punctuation
  4. y = [random.choice(x) for i in range(1000)]
  5. z = "".join(y)
  6. dict1 = dict()
  7. dict2 = dict()
  8. print('随机生成的字符是',z)
  9. a=''.join(set(z))
  10. print('字符数量是',len(a))
  11. #第一种统计方法
  12. for a in z :
  13.     dict1[a] = dict1.get(a, 0) + 1
  14. print(dict1)
  15. #第二种
  16. for a in z :
  17.     dict2.setdefault(a, 0)
  18.     dict2[a] += 1
  19. print(dict2)

  20. list1 = list(dict1.items())
  21. list1.sort(key=lambda x:x[1],reverse=True)

  22. #前五名,不管后面的
  23. print('从大到小是:',dict(list1))
  24. print('前五名')
  25. for i in range(5):
  26.      print(*list1[i])
  27. #前五名,如果后面的值跟第五名相同,就继续打印
  28. print('从大到小是:',dict(list1))
  29. print('前五名')
  30. for i in range(1000):
  31.      if i < 5:
  32.           print(*list1[i])
  33.      else:
  34.           if list1[i][1] == list1[i-1][1]:
  35.                print(*list1[i])
  36.           else:
  37.                break


  38. count_max = max(dict1.values())
  39. count_min = min(dict1.values())
  40. #根据value找key
  41. count_max_keys_list = [key for key,value in dict1.items() if value == count_max]
  42. count_min_keys_list = [key for key,value in dict1.items() if value == count_min]
  43. print("出现次数最多的是:",*count_max_keys_list,'出现次数为:',count_max)
  44. print("出现次数最少的是:",*count_min_keys_list,'出现次数为:',count_min)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-23 12:28:18 | 显示全部楼层
qq1151985918 发表于 2021-4-23 08:58
你做的方法是有错误的,给你修改了。

感谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-2 07:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表