【发布时间】:2019-11-12 06:07:36
【问题描述】:
我想迭代两个列表,以便我可以从一个列表中获取任意数量的值并保持我在另一个列表中的位置。
我使用索引来存储每个列表中的当前位置,然后使用 while 循环遍历它们,但这绝对不是 Python 的。
def alternate_iterate(a,b,cond=lambda x, y : x > y):
pos_a = 0
pos_b = 0
retval = []
while(True):
if(pos_a == len(a) and pos_b == len(b)):
break
if(pos_a < len(a) and cond(a[pos_a],b[pos_b])):
retval += [a[pos_a]]
pos_a += 1
elif(pos_b < len(b)):
retval += [b[pos_b]]
pos_b += 1
return retval
#example usage
print(alternate_iterate(['abc','abcd','ab','abc','ab'],
['xy','xyz','x','xyz'],
cond=lambda x,y: len(x) > len(y))
这应该打印['abc','abdc','xy','xyz','ab','abc','ab','x','xyz'],您没有完美的 1:1 交替顺序。元素的顺序和元素的类型应该只取决于 cond 的定义。
【问题讨论】:
-
由于您没有为名称
a到f提供值,因此需要花费大量精力才能确定您真正需要的内容。 -
是的,
a的值是什么,它们可以是像'a'这样的字符串,因为您正在比较字符串和整数(在 python 3 中不可能) -
我已经重新打开了这个,因为我相信
cond函数可能会改变所需的解决方案(但没有澄清,它可能会再次关闭) -
另外,预计
b += 1语句会带来麻烦,因为 b 是一个列表,因此当您尝试增加它时会导致 TypeError。与a += 1类似。我怀疑这些应该对各自的pos_*名称进行操作。