迭代两个列表并同步它们

Yar*_*riv 3 python iteration

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

伪代码:

j=1
for i=1 to n:
   print a[i], b[j]
   while b[j+1] <= a[i]:
      j++
      print a[i], b[j]
Run Code Online (Sandbox Code Playgroud)

例如:

a = [1 3 5 7]
b = [2 4 9] 
Run Code Online (Sandbox Code Playgroud)

期望的输出:

1 2
3 2
5 2
5 4
7 4
Run Code Online (Sandbox Code Playgroud)

你怎么干净地在python中做到这一点?

mur*_*d99 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]
Run Code Online (Sandbox Code Playgroud)

请注意一些变化,使其在Python中工作:

  1. 声明列表时,项目之间需要逗号.
  2. 列表索引从0开始,所以双方ij应该从那里开始.
  3. len(a)返回的长度a(4在这种情况下),和迭代i通过range(len(a))执行从对于每个整数循环0len(a)-1,这是所有在索引a.
  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]
Run Code Online (Sandbox Code Playgroud)

通常,您可能不希望只打印列表元素,因此对于更一般的用例,您可以创建生成器,如:

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])
Run Code Online (Sandbox Code Playgroud)

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

a = [1, 3, 5, 7]
b = [2, 4, 9]
for (e1, e2) in sync_lists(a, b):
    print e1, e2
Run Code Online (Sandbox Code Playgroud)