使用set().intersection()比较列表/字典中任意数量X的多个集合



正如标题中所说,我想使用set((.contersection((比较列表/字典中任意数量X的多个集合,并输出一个包含所有匹配项的集合。

我目前有:

asset_list = ["BTC", "ETH", "AAVE", "YFI", "COMP"]
timestamp_dict = {} #this has all timestamps for assets above
timestamp_matches = {}
for i in range(1, len(asset_list)):
timestamp = set(timestamp_dict[asset_list[0]]).intersection(timestamp_dict[asset_list[i]])
timestamp_matches[asset_list[i]] = timestamp

它返回dict"timestamp_matches",其中包含"asset_list"中每个资产的匹配列表,我意识到我已经告诉过它了

timestamp_matches = set(timestamp_dict["BTC"]).intersection(
set(timestamp_dict["ETH"]),
set(timestamp_dict["AAVE"]),
set(timestamp_dict["YFI"]),
set(timestamp_dict["COMP"]))

但这意味着我必须对每一项资产进行硬编码,而这是我无法实现目标的。

谢谢!

这种递归函数应用程序可以使用functools.reduce.完成

在本例中,我们使用列表中的第一个集合作为基础,然后将其与其他每个集合相交。

>>> sets = [{1, 2}, {1, 2, 3}, {1, 2, 3, 4}]
>>> functools.reduce(set.intersection, sets[1:], sets[0])
{1, 2}

您的代码可能如下所示:

import functools
asset_list = ["BTC", "ETH", "AAVE", "YFI", "COMP"]
timestamp_dict = {} #this has all timestamps for assets above
sets = [set(v) for k, v in timestamp_dict.items() if k in asset_list]
timestamp_matches = functools.reduce(set.intersection, sets[1:], sets[0])

线路

sets = [set(v) for k, v in timestamp_dict.items() if k in asset_list]

如果对应的关键字在CCD_ 3中,则为CCD_ 2中的每个值创建CCD_。

如果您想要数据中所有集合的交集,您可以使用一个变量来存储第一个集合,然后使用它来计算它与其他集合的交集你几乎完成了,只需要稍微修改一下你的代码:

asset_list = ["BTC", "ETH", "AAVE", "YFI", "COMP"]
timestamp_dict = {} #this has all timestamps for assets above
asset1 =  asset_list[0]
timestamp1 = timestamp_dict[asset1]
timestamp_matches = set(timestamp1)
for i in range(1):
asset_next = asset_list[i]
timestamp = timestamp_dict[asset_next]
timestamp = set(timestamp)
timestamp_matches = timestamp_matches.intersection(timestamp)

顺便说一句,如果你只对单行代码做一件事,你会提高代码的可读性。

最新更新