gpt4 book ai didi

python - 在 Python 中比较多个字典

转载 作者:太空狗 更新时间:2023-10-30 01:43:12 25 4
gpt4 key购买 nike

我是 Python 新手,遇到了一个无法通过 google 解决的问题。我已经使用 wxPython 和 ObjectiveListView 构建了一个 GUI。在其正中央,GUI 有一个列表控件,以 X 行(数据由用户加载)和五列显示数据。

当用户从列表控件中选择多个条目时(在单击时按下 CTRL 或 shift),ObjectiveListView 模块会为我提供一个字典列表,这些字典包含列表控件行中的数据。这正是我想要的,好!

返回的列表看起来像这样:

print MyList
[{'id':1023, 'type':'Purchase', 'date':'23.8.2008', 'sum':'-21,90', 'target':'Apple Store'}, {'id':1024, 'type':'Purchase', 'date':'24.8.2008', 'sum':'-21,90', 'target':'Apple Store'}, {'id':23, 'type':'Purchase', 'date':'2.8.2008', 'sum':'-21,90', 'target':'Apple Store'}]

所有字典都有相同的键,但值会改变。 “id”值是唯一的。问题从这里开始。我想获得用户选择的所有项目的共同值(value)。在上面的列表中,它们将是 'sum':'-21,90' 和 'target':'Apple Store'。

我不知道如何正确比较列表中的字典。一个大问题是我事先不知道列表包含多少个字典,因为它是由用户决定的。

我有一个模糊的想法,列表推导将是可行的方法,但我只知道如何使用列表推导来比较两个列表,而不是 n 个列表。任何帮助将不胜感激。

最佳答案

>>> mysets = (set(x.items()) for x in MyList)
>>> reduce(lambda a,b: a.intersection(b), mysets)
set([('sum', '-21,90'), ('type', 'Purchase'), ('target', 'Apple Store')])

首先,我创建了一个生成器,它将字典列表转换为一组可迭代的键值对序列。您可以在此处使用列表理解,但这种方式不会将您的整个列表转换为另一个列表,如果您不知道它有多大,这很有用。

然后,我使用 reduce 应用了一个函数来查找每个集合之间的公共(public)值。它找到集合 1 和集合 2 的交集,这本身就是一个集合,然后是该集合和集合 3 的交集,等等。mysets 生成器将愉快地将每个集合按需提供给 reduce 函数,直到它完成。

我相信 reduce 已被弃用为 Python 3.0 中的内置功能,但在 functools 中应该仍然可用。

当然,您可以通过将 reduce 中的 mysets 替换为生成器表达式来使其成为单行代码,但这会降低 IMO 的可读性。在实践中,我什至可能更进一步,将 lambda 也分解成它自己的一行:

>>> mysets = (set(x.items()) for x in MyList)
>>> find_common = lambda a,b: a.intersection(b)
>>> reduce(find_common, mysets)
set([('sum', '-21,90'), ('type', 'Purchase'), ('target', 'Apple Store')])

如果你需要最终结果是一个字典,就像这样包装它:

>>> dict(reduce(find_common, mysets))
{'sum': '-21,90', 'type': 'Purchase', 'target': 'Apple Store'}

dict 可以接受任何键值对的迭代器,例如最后返回的元组集合。

关于python - 在 Python 中比较多个字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/314583/

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