3

我需要通过以下方式迭代两个列表:

伪代码:

j=1
for i=1 to n:
   print a[i], b[j]
   while b[j+1] <= a[i]:
      j++
      print a[i], b[j]

例如:

a = [1 3 5 7]
b = [2 4 9] 

期望的输出:

1 2
3 2
5 2
5 4
7 4

你如何在python中干净地做到这一点?

4

2 回答 2

7

您的伪代码几乎可以在 Python 中运行。一些可以满足您要求的工作代码是:

a = [1, 3, 5, 7]
b = [2, 4, 9] 
j = 0
for i in range(len(a)):
    print a[i], b[j]
    while j<len(b)-1 and b[j+1] <= a[i]:
        j += 1
        print a[i], b[j]

请注意使其在 Python 中工作的一些更改:

  1. 声明列表时,项目之间需要逗号。
  2. 列表索引从 0 开始,因此两者都i应该j从那里开始。
  3. len(a)返回(在这种情况下为 4)的长度a,并迭代执行i从到range(len(a))的每个整数的循环,这是 中的所有索引。0len(a)-1a
  4. ++Python中不支持该操作,所以我们j +=1改用。
  5. 我们必须避免使用 的超出范围的索引b,因此我们在增加它之前进行测试以确保j在范围内。

通过遍历列表,可以使这段代码更加 Pythonic,如下所示:

a = [1, 3, 5, 7]
b = [2, 4, 9] 
j = 0
for element in a:
   print element, b[j]
   while j<len(b)-1 and b[j+1] <= element:
      j += 1
      print element, b[j]

一般来说,您可能不想只打印列表元素,因此对于更一般的用例,您可以创建一个生成器,例如:

def sync_lists(a, b)
    if b:
        j = 0
        for element in a:
            yield (element, b[j])
            while j<len(b)-1 and b[j+1] <= element:
                j += 1
                yield (element, b[j])

然后你可以像以前一样打印它们

a = [1, 3, 5, 7]
b = [2, 4, 9]
for (e1, e2) in sync_lists(a, b):
    print e1, e2
于 2012-08-06T17:15:04.810 回答
2

murgatroid99 的答案中的生成器代码可以通过使用next()而不是索引算术来推广到任何可迭代对象(而不是仅序列):

def sync_list(a, b):
    b = iter(b)
    y, next_y = next(b), next(b)
    for x in a:
       yield x, y
       while next_y <= x:
          y, next_y = next_y, next(b)
          yield x, y
于 2012-08-06T18:45:07.067 回答