在Python中有效地循环遍历列表

时间:2016-09-15 16:06:28

标签: python list loops iterator

我需要创建一个python函数,给定有序列表<option>a返回b如果a中存在一个项目,则认为True中有一个项目1}}即b

这当然可以通过以下方式轻松完成:

a+1

但是,我需要尽可能提高效率,因为该函数将用于处理数据负载。给我的提示是使用for item in a: if (a+1 in b): return True iter()操作,但我还没有找到一种方法来使用它们进行有效的处理。有谁知道如何实现这些,或使用另一个快速的algorythm? 提前谢谢。

3 个答案:

答案 0 :(得分:1)

我可以看到两个效率更高的选项。

  1. 浏览a中的每个元素,并在element+1中对b执行二进制搜索。
  2. 时间复杂度:O(n * log(m))其中n = |a|且m = |b|

        for element in a:
            if binary_search(a, element+1):
                return True
        return False
    
    1. 通过[0,|a|)和[0,|b|)增加两个计数器,比如ij。在i小于|a|j小于|b|时循环。将a[i] + 1b[j]进行比较。如果它们相等,则返回True。如果值a[i] + 1 > b[j],则增加j。否则,请增加i
    2. 时间复杂度:O(n + m)其中n = |a|且m = |b|

          i = 0
          j = 0
          while i < len(a) and j < len(b):
              if a[i] + 1 == b[j]:
                  return True
              elif a[i] + 1 > b[j]:
                  j += 1
              else:
                  i += 1
          return False            
      

答案 1 :(得分:1)

警告:代码测试不是很好。假设您编写了排序列表。

iternext提示背后的想法是,在一个循环中,您可以在一个或另一个列表中前进。如果第一个数字太小,则尝试下一个第一个数字。如果第二个太小,则尝试文本第二个数字。

def test1(a, b): 
    ia = iter(a)
    ib = iter(b)
    try:
        ea = next(ia)
        eb = next(ib)
        while True:
            print("debug: comparing {} -- {}".format(ea, eb))
            diff = ea - eb
            if diff == -1: 
                print("debug: OK!")
                return True
            elif diff < -1: 
                ea = next(ia)
            else:
                eb = next(ib)
    except StopIteration:
        print("debug: not found")
        return False

lista=[1,2,4,10,31,33,45,67]
listb=[7,16,22,29,34,39,49,59,60,100,200,300]
test1(lista, listb)

输出显示算法正在运行:

debug: comparing 1 -- 7
debug: comparing 2 -- 7
debug: comparing 4 -- 7
debug: comparing 10 -- 7
debug: comparing 10 -- 16
debug: comparing 31 -- 16
debug: comparing 31 -- 22
debug: comparing 31 -- 29
debug: comparing 31 -- 34
debug: comparing 33 -- 34
debug: OK!

答案 2 :(得分:0)

谢谢你们的回答!我最终使用了您的解决方案的组合版本:

a = iter(l1)
b = iter(l2)
i = next(a)
j = next(b)
try:
    while (i):
        if i + 1 == j:
            return True
        elif i + 1 > j:
            j = next(b)
        else:
            i = next(a)
except StopIteration:
    return False