Hakutaku 2018-04-08 15:08 采纳率: 100%
浏览 3334
已采纳

【Python】求助 字典value改成想要的值,具体如下

例如 dict1 = {'a': 10, 'b': 5, 'c': 5, 'd': 2, 'e': 2, 'f': 2, 'g': 1}
要求 得到两个新字典:
1. dictnew1 ={'a': 1, 'b': 2, 'c': 2, 'd': 3, 'e': 3, 'f': 3, 'g': 1}
新字典1 value所代表的是原字典value出现的频率。
比如 原字典 a:10 而10在原字典value里只出现过一次,所以新字典 a 的value变为1 。而原字典key b 和 c 的values都为 5 ,5出现了两次所以新字典 key b c value变为2.

        2. dictnew2 = {'a': 1, 'b': 2, 'c': 2, 'd': 4, 'e': 4, 'f': 4, 'g': 7}
        新字典2 里的value 所代表的意思是:例如 key a 是原字典里的第一个key,所以新字典2里 key a 的value 是1 ; key b 是源字典里第二个key,所以新字典2里 key b的value 是 2 ; 但 key c 在源字典里与key b 有着相同的 value ,所以在新字典2里 key c 的value 和key b 相同 也是2;到 key d 的时候,d在原字典里是第4个key,所以在新字典2里key d 的value是4 (而不是3)同理 e和 f 在新字典2里的value 也是4.而最后 key g 在原字典是第7个 key ,所以新字典2里 key g的value是7

        希望能给出详细的代码和解释,不胜感激。
  • 写回答

4条回答 默认 最新

  • chen222246lei 2018-04-09 07:03
    关注

    coding:utf-8

    from operator import itemgetter

    dict1 = {'a': 10, 'b': 5, 'c': 5, 'd': 2, 'e': 2, 'f': 2, 'g': 1}

    generate first dictionary

    tmpdict = {}
    for value in dict1.values():
    if value in tmpdict:
    tmpdict[value] += 1
    else:
    tmpdict.setdefault(value,1)

    dictnew1 = {}
    for name,value in dict1.items():
    dictnew1[name] = tmpdict[value]
    print(dictnew1)

    ~ # generate second dictionary

    n1 = 1
    n2 = 1
    lastvalue = 0
    dictnew2 = {}
    for name,value in dict1.items():
    if n1 == 1:
    dictnew2.setdefault(name,n1)
    lastvalue = value
    else:
    if value == lastvalue:
    dictnew2.setdefault(name,n2)
    else:
    dictnew2.setdefault(name,0)
    dictnew2[name] = n1
    lastvalue = value
    n2 = n1
    n1 += 1
    print(dictnew2)

    {'a': 1, 'b': 2, 'c': 2, 'd': 3, 'e': 3, 'f': 3, 'g': 1}
    {'a': 1, 'b': 2, 'c': 2, 'd': 4, 'e': 4, 'f': 4, 'g': 7}


    (program exited with code: 0)

    请按任意键继续. . .

    第一个字典:
    首先获得每个value的统计,存入一个临时字典tmpdict; 即第一个for循环
    然后将原字典(dict1)的name = tmpdict[value]

    第二个字典:
    其实就是按照dict1的原始顺序进行计数,碰到一样的value 值不变(用n2),一旦改变就用n1

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作