如何使用yield将两个列表中的数字通过索引连接到元组中?(Python)



我需要制作一个"生成函数";它将取2个列表,并通过索引将来自两个列表的numbres连接到元组中。例如:

l1 = [3, 2, 1]
l2 = [4, 3, 2]

第一次迭代的结果将是(3, 4)第二次迭代的结果将是(2, 3)第三个(1, 2)而且,其中一个列表的数字可能比另一个多。在这种情况下,我需要写条件";如果其中一个列表在迭代时结束,则不执行进一步的迭代"(使用try, except(

我知道,生成器函数使用yield而不是return,但我不知道如何编写这个函数。。。我做了这个

def generate_something(l1, l2):
l3 = tuple(tuple(x) for x in zip(l1, l2))
return l3

输出为

((3, 4), (2, 3), (1, 2))

它可以工作,但这不是geterator函数,没有yield,也没有第一次、第二次等迭代。我希望你能帮我…

可能会对您有所帮助:

def generate_something_2(l1, l2):
# if one of the lists ended while iterating, then no further iterations are performed.
# For this get minimal len of list
min_i = len(l1) if len(l1) < len(l2) else len(l2)
for i in range(0,min_i):
yield (l1[i], l2[i])
l1 = [3, 2, 1, 1]
l2 = [4, 3, 2]
l3 = tuple(generate_something_2(l1, l2))
# Result: ((3, 4), (2, 3), (1, 2))
print(l3)

您可以创建自己的生成器:

def iterate_lists(l1,l2):
for i,item in enumerate(l1):
yield l1[i],l2[i]

或者作为生成器理解的变量:

iterate_lists = (li[i],l2[i] for i,item in enumerate(l1))

如果长度不相等,我不清楚你到底想做什么,如果没有消息,你可以按较小的列表。。。只需用for i in range(min((len(l1),len(l2)))更改for i,item in enumerate(l1)

使用while循环并跟踪索引位置,当提出IndexError时,您已经到达最短列表的末尾并停止:

def generate_something(l1, l2):
idx = 0
while True:
try:
yield l1[idx], l2[idx]
idx += 1
except IndexError:
break

l1 = [3, 2, 1]
l2 = [4, 3, 2]
g = generate_something(l1, l2)
print(list(g))

输出:

[(3, 4), (2, 3), (1, 2)]

最新更新