微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据键将字典值组合在一起

如何解决根据键将字典值组合在一起

我希望将输入集中的值与作为键的元组中的第一个元素一起分组。第二个元素需要根据公共键组合到一个列表中。输出需要是一个包含元组的列表。

# Input set
values = {(304008,2020.0),(304008,2017.0),(250128,(93646,2017.0)}

# Current workflow
keys = {i[0] for i in values}

id_dict = dict()
for k in keys:
    id_dict[k] = [int(i[1]) for i in values if i[0] == k]

lst2 = list(id_dict.items())
# Expected output
# [(250128,[2020]),[2017,2020]),[2020,2017])]

我有预期的输出,但是整个过程太慢了。我希望让它更快。我正在查看 groupby 函数,但我似乎无法让它们工作。

解决方法

您可以使用 itertools.groupby 来完成此操作。基本上按元组中的第一个元素分组,然后列出每个组中的第二个元素。

>>> from itertools import groupby
>>> [(k,[i[1] for i in g]) for k,g in groupby(sorted(values),key=lambda i: i[0])]
[(93646,[2017.0,2020.0]),(250128,[2020.0]),(304008,2020.0])]
,

您可以使用 setdefault 制作一个以键作为元组第一项的字典,并在集合上迭代以单次填充它。 使用列表构造函数来获取所需的列表。见下文:

>>> values = {(304008,2020.0),2017.0),(93646,2017.0)}
>>> info = {}
>>> for elements in values:
...     info.setdefault(elements[0],[]).append(elements[1])
... 
>>> list(info.items())
[(304008,[2020.0])]
>>> 

这不使用 groupby 但避免了第二个循环。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?