我需要通过以下方式迭代两个列表:
伪代码:
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中干净地做到这一点?
您的伪代码几乎可以在 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 中工作的一些更改:
i
应该j
从那里开始。len(a)
返回(在这种情况下为 4)的长度a
,并迭代执行i
从到range(len(a))
的每个整数的循环,这是 中的所有索引。0
len(a)-1
a
++
Python中不支持该操作,所以我们j +=1
改用。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
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