【问题标题】:Comparing multiple sets for any and any number of X in a list/dictionary using set().intersection()使用 set().intersection() 比较列表/字典中任意数量的 X 的多个集合
【发布时间】:2023-03-23 03:40:02
【问题描述】:

如标题所示,我想使用 set().intersection() 比较列表/字典中任意数量的 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

它返回字典“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"]))

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

谢谢!

【问题讨论】:

    标签: python set intersection


    【解决方案1】:

    这种递归函数应用可以用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]
    

    是一个list comprehension,它为timestamp_dict 中的每个值创建一个set,如果相应的键在asset_list 中。

    【讨论】:

      【解决方案2】:

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

      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)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        相关资源
        最近更新 更多