鱼C论坛

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

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

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

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

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

x
题目是:

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

现在已经做到:
import random
import string
x = string.ascii_letters + string.digits + string.punctuation
y = [random.choice(x) for i in range(1000)]
z = "".join(y)
dict1 = dict()
dict2 = dict()
print('随机生成的字符是',z)
a=''.join(set(z))
print('字符数量是',len(a))
#第一种统计方法
for a in z :
    dict1[a] = dict1.get(a, 0) + 1
print(dict1)
#第二种
for a in z :
    dict2.setdefault(a, 0)
    dict2[a] += 1
print(dict2)
list1 = list(dict1.items())
list1.sort(key=lambda x:x[1],reverse=True)
print('从大到小是:',dict(list1))
newdict=dict(zip(dict1.values(),dict1.keys()))
def f(x) :
    v1=sorted(dict1.values(),reverse=True)[x]
    print(newdict.get(v1),v1)
    return
f(0)
f(1)
f(2)
f(3)
f(4)
print("出现次数最多的是:['",newdict.get(sorted(dict1.values(),reverse=True)[0]),"']",sorted(dict1.values(),reverse=True)[0])
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
你做的方法是有错误的,给你修改了。
import random
import string
x = string.ascii_letters + string.digits + string.punctuation
y = [random.choice(x) for i in range(1000)]

##z = "".join(y)

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

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

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

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

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

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

print("-"*20)
print('前五:',dict(list1[:5]))
maxstr = {}
minstr = {}
for i in dict1:
    if dict1[i] == max(dict1.values()):
        maxstr[i] = dict1[i]
    if dict1[i] == min(dict1.values()):
        minstr[i] = dict1[i]
print("最多",maxstr)
print("最少",minstr)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

##z = "".join(y)

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

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

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

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

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

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

print("-"*20)
print('前五:',dict(list1[:5]))
maxstr = {}
minstr = {}
for i in dict1:
    if dict1[i] == max(dict1.values()):
        maxstr[i] = dict1[i]
    if dict1[i] == min(dict1.values()):
        minstr[i] = dict1[i]
print("最多",maxstr)
print("最少",minstr)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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


def StringToDict(rs: str):
    result = {}
    for c in rs:
        try:
            result[c] += 1
        except Exception:
            result[c] = 1

    return result


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


if __name__ == '__main__':
    randomString = MakeRandom()
    countDict = StringToDict(randomString)
    countDict = CountSort(countDict)
    print(countDict)

字典的键是唯一的,值用来计数不就完事了么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

#前五名,不管后面的
print('从大到小是:',dict(list1))
print('前五名')
for i in range(5):
     print(*list1[i])
#前五名,如果后面的值跟第五名相同,就继续打印
print('从大到小是:',dict(list1))
print('前五名')
for i in range(1000):
     if i < 5:
          print(*list1[i])
     else:
          if list1[i][1] == list1[i-1][1]:
               print(*list1[i])
          else:
               break


count_max = max(dict1.values())
count_min = min(dict1.values())
#根据value找key
count_max_keys_list = [key for key,value in dict1.items() if value == count_max]
count_min_keys_list = [key for key,value in dict1.items() if value == count_min]
print("出现次数最多的是:",*count_max_keys_list,'出现次数为:',count_max)
print("出现次数最少的是:",*count_min_keys_list,'出现次数为:',count_min)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 23:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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