【问题标题】:iterating quickly through list of tuples快速遍历元组列表
【发布时间】:2013-04-07 22:40:20
【问题描述】:

我想知道是否有一种更快、更省时的方法来遍历元组列表,找到正确的匹配项。我要做的是:

# this is a very long list.
my_list = [ (old1, new1), (old2, new2), (old3, new3), ... (oldN, newN)]

# go through entire list and look for match
for j in my_list:
    if j[0] == VALUE:
        PAIR_FOUND = True
        MATCHING_VALUE = j[1]
        break

此代码可能需要相当长的时间才能执行,具体取决于列表中的项目数。我确信有更好的方法来做到这一点。

【问题讨论】:

    标签: python


    【解决方案1】:

    我认为你可以使用

    for j,k in my_list:
      [ ... stuff ... ]
    

    【讨论】:

    【解决方案2】:

    可以清理代码,但是如果您使用列表来存储元组,则任何此类查找都将是 O(N)。

    如果查找速度很重要,您应该使用dict 来存储您的元组。键应该是元组的第 0 个元素,因为这就是您要搜索的内容。您可以轻松地从您的列表中创建一个字典:

    my_dict = dict(my_list)
    

    然后,(VALUE, my_dict[VALUE]) 将为您提供匹配的元组(假设 VALUE 存在)。

    【讨论】:

      【解决方案3】:

      假设更多的内存使用不是问题,并且如果您的元组的第一项是可散列的,您可以从您的元组列表中创建一个dict,然后查找该值就像查找一个来自dict 的密钥。比如:

      dct = dict(tuples)
      val = dct.get(key) # None if item not found else the corresponding value
      

      编辑:要创建反向映射,请使用以下内容:

      revDct = dict((val, key) for (key, val) in tuples)
      

      【讨论】:

      • 看起来不错,但只允许我通过 old value 进行搜索。我是否需要创建两个 dicts 以便在新旧值字段中进行搜索?
      • @memyself:是的,你是对的。如果您需要通过 both 旧值和新值进行搜索,则必须创建两个字典。但我想如果你想要的只是快速查找,那还不错。我添加了用于创建反向字典的示例 sn-p。
      • 我不知道 get(),这让我的生活变得如此简单。
      【解决方案4】:

      不知道下面的方法是不是你想要的。

      您可以使用defaultdict

      >>> from collections import defaultdict
      >>> s = [('red',1), ('blue',2), ('red',3), ('blue',4), ('red',1), ('blue',4)]
      >>> d = defaultdict(list)
      >>> for k, v in s:
             d[k].append(v)    
      >>> sorted(d.items())
      [('blue', [2, 4, 4]), ('red', [1, 3, 1])]
      

      【讨论】:

        【解决方案5】:

        这个问题已经死了,但仍然知道另一种方法并没有什么坏处:

        my_list = [ (old1, new1), (old2, new2), (old3, new3), ... (oldN, newN)]
        
        for first,*args in my_list:
            if first == Value:
                PAIR_FOUND = True
                MATCHING_VALUE = args
                break
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-20
          • 2014-09-16
          • 2019-11-16
          • 1970-01-01
          • 1970-01-01
          • 2021-08-08
          相关资源
          最近更新 更多