社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

在进行算术运算时如何维护两个python字典之间的匹配顺序

Ben Smith • 4 年前 • 696 次点击  

members = OrderedDict({
    "member1" : ["PCP2", "PCP3"],
    "member2" : ["PCP1", "PCP2"],
    "member3" : ["PCP3"],
    "member4" : ["PCP1"],
    "member5" : ["PCP4", "PCP5"],
    "member6" : ["PCP1", "PCP5"],
    "member7" : ["PCP2", "PCP3", "PCP4"],
    "member8" : ["PCP3", "PCP5"],
    "member9" : ["PCP1", "PCP4", "PCP5"],
    "member10" : ["PCP2", "PCP4"],
    "member11" : ["PCP2"],
    "member12" : ["PCP3"],
    "member13" : ["PCP4", "PCP5"]
    })
providers = OrderedDict({
    "PCP1" : 3,
    "PCP2" : 4,
    "PCP3" : 2,
    "PCP4" : 3,
    "PCP5" : 4,
})

价值观 providers members 对于每个提供者。

PCPcounts = {}
for m in members.values():
    for v in m:
        if v in PCPcounts:
            PCPcounts[v] += 1
        else:
            PCPcounts[v] = 1
PCPcounts

如果我像这样运行我的笔记本电脑,我会按我想要的顺序输出它:

{'PCP1': 4, 'PCP2': 5, 'PCP3': 5, 'PCP4': 5, 'PCP5': 5}

但是如果我用 print(PCPcounts) 我得到:

{'PCP2': 5, 'PCP3': 5, 'PCP1': 4, 'PCP4': 5, 'PCP5': 5}

differences = dict()
    for (k,v), (k2,v2) in zip(PCPcounts.items(), providers.items()):
        differences[k] = v - v2

print(differences)
{'PCP2': 2, 'PCP3': 1, 'PCP1': 2, 'PCP4': 2, 'PCP5': 1}

这是不对的。例如 PCP1: 2 应该是, PCP1: 1 PCPcounts . 我试过用 OrderedDict()

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53817
 
696 次点击  
文章 [ 2 ]  |  最新文章 4 年前
Jab
Reply   •   1 楼
Jab    4 年前

collections.Counter 而不是 collections.OrderedDict :

from collections import Counter

members = {
    "member1" : ["PCP2", "PCP3"],
    "member2" : ["PCP1", "PCP2"],
    "member3" : ["PCP3"],
    "member4" : ["PCP1"],
    "member5" : ["PCP4", "PCP5"],
    "member6" : ["PCP1", "PCP5"],
    "member7" : ["PCP2", "PCP3", "PCP4"],
    "member8" : ["PCP3", "PCP5"],
    "member9" : ["PCP1", "PCP4", "PCP5"],
    "member10" : ["PCP2", "PCP4"],
    "member11" : ["PCP2"],
    "member12" : ["PCP3"],
    "member13" : ["PCP4", "PCP5"]}
providers = Counter({
    "PCP1" : 3,
    "PCP2" : 4,
    "PCP3" : 2,
    "PCP4" : 3,
    "PCP5" : 4,
})

PCPcounts = Counter()

for m in members.values():
    PCPcounts.update(m)

differences = PCPcounts - providers

差异打印:

Counter({'PCP3': 3, 'PCP4': 2, 'PCP2': 1, 'PCP1': 1, 'PCP5': 1})

itertools.chain

from itertools import chain
PCPcounts = Counter(chain(*members.values()))

而不是for循环。

Alireza Tajadod
Reply   •   2 楼
Alireza Tajadod    4 年前

不如用这样的东西来代替拉链:

differences = dict()
for k in PCPcounts:
    differences[k] = PCPcounts[k] - providers[k]

我觉得拉链太复杂了,因为你已经有了通用钥匙