我想迭代两个列表,这样我就可以从一个列表中获取任意数量的值,并保持我在另一个列表中的位置。你知道吗
我已经使用索引来存储每个列表中的当前位置,然后使用一个while循环来遍历它们,但这绝对不是什么好东西。你知道吗
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
的定义。你知道吗
此版本仅使用迭代器以惰性方式实现功能(这是Pythonic):
印刷品:
更具python风格的方法通常是根本不使用索引,最好不要使用异常作为控制“预期”程序逻辑的手段。你也应该避免不必要的括号。你知道吗
下面是如何使用迭代器:
这样做还有一个额外的好处,就是使函数能够有效地使用任何可编辑的数据作为参数。你知道吗
例如:
它还可以方便地为延迟遍历创建迭代器版本的函数:
编辑将
None
更改为Done
,以使函数支持None作为输入列表中的合法值。你知道吗欢迎使用Stackoverflow。总之,您似乎希望根据某个谓词的值从一个列表或另一个列表中获取一个值。您现有的逻辑似乎没有考虑其中一个列表用尽的可能性,此时我假设您希望从另一个列表复制任何剩余的值。你知道吗
您可以在列表上构建迭代器,并使用
next
函数获取下一个值,而不是使用索引值来选择连续的列表元素。你知道吗在这种情况下,你的逻辑最终会变成这样:
我得到的结果是
这似乎是你所期望的。你知道吗
像这样的例子中经常出现的情况一样,您编写更多的逻辑来处理更为罕见的情况(在本例中,一个列表或另一个列表变得筋疲力尽),而不是处理事情正常进行的“快乐之路”。你知道吗
相关问题 更多 >
编程相关推荐