gpt4 book ai didi

python - 比较字典并更新结果列表

转载 作者:行者123 更新时间:2023-12-01 06:16:58 28 4
gpt4 key购买 nike

我有一个字典列表,我想将该列表中的每个字典与结果列表中的字典进行比较,如果不存在,则将其添加到结果列表中,如果存在,则更新与该字典关联的计数器.

起初我想使用 Python : List of dict, if exists increment a dict value, if not append a new dict 中描述的解决方案但我收到一个错误,一个字典不能用作另一个字典的 key 。

所以我选择的数据结构是一个列表,其中每个条目都是一个字典和一个整数:

r = [[{'src': '', 'dst': '', 'cmd': ''}, 0]]

原始数据集(应与结果数据集进行比较)是一个字典列表:

d1 = {'src': '192.168.0.1',
'dst': '192.168.0.2',
'cmd': 'cmd1'}
d2 = {'src': '192.168.0.1',
'dst': '192.168.0.2',
'cmd': 'cmd2'}
d3 = {'src': '192.168.0.2',
'dst': '192.168.0.1',
'cmd': 'cmd1'}
d4 = {'src': '192.168.0.1',
'dst': '192.168.0.2',
'cmd': 'cmd1'}
o = [d1, d2, d3, d4]

结果应该是:

r = [[{'src': '192.168.0.1', 'dst': '192.168.0.2', 'cmd': 'cmd1'}, 2],
[{'src': '192.168.0.1', 'dst': '192.168.0.2', 'cmd': 'cmd2'}, 1],
[{'src': '192.168.0.2', 'dst': '192.168.0.1', 'cmd': 'cmd1'}, 1]]

实现这一目标的最佳方法是什么?我有一些代码示例,但没有一个是真正好的,而且大多数都无法正常工作。

感谢您对此的任何意见!

更新

Tamås 注释后的最终代码是:

from collections import namedtuple, defaultdict
DataClass = namedtuple("DataClass", "src dst cmd")
d1 = DataClass(src='192.168.0.1', dst='192.168.0.2', cmd='cmd1')
d2 = DataClass(src='192.168.0.1', dst='192.168.0.2', cmd='cmd2')
d3 = DataClass(src='192.168.0.2', dst='192.168.0.1', cmd='cmd1')
d4 = DataClass(src='192.168.0.1', dst='192.168.0.2', cmd='cmd1')
ds = d1, d2, d3, d4
r = defaultdict(int)
for d in ds:
r[d] += 1
print "list to compare"
for d in ds:
print d
print "result after merge"
for k, v in r.iteritems():
print("%s: %s" % (k, v))

最佳答案

好吧,如果你的原始字典只包含 srcdstcmd,你可以使用命名元组,它是可散列的,所以您可以使用字典中的命名元组作为键。

from collections import namedtuple

DataClass = namedtuple("DataClass", "src dst cmd")
d1 = DataClass(src='192.168.0.2', dst='192.168.0.1', cmd='cmd1')

(抱歉这个愚蠢的类名;因为我不知道你的听写代表什么,所以我无法想出更好的名字)。您甚至可以从字典创建 DataClass 实例:

d1 = DataClass(**d1_as_dict)

此时,您的主计数循环简化为:

from collections import defaultdict, namedtuple

r = defaultdict(int)
for obj in [d1, d2, d3, d4]:
r[obj] += 1

如果由于某种原因,您无法使用 Python <= 2.5,可以使用一个直接的 namedtuple 替换类 here .

关于python - 比较字典并更新结果列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2773522/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com