如何使用 yield 将两个列表中的数字按索引连接到一个元组中?(Python)
How can I concatenate numbers from two lists by indices into a tuple using yield?(Python)
我需要创建一个“生成器函数”,它将获取 2 个列表并将两个列表中的数字按索引连接成一个元组。例如:
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 iterate_lists(l1,l2):
for i,item in enumerate(l1):
yield l1[i],l2[i]
或作为变量 generator comprehension:
iterate_lists = (li[i],l2[i] for i,item in enumerate(l1))
关于如果长度不相等,我不清楚你到底想做什么,没有消息你可以继续较小的列表...
只需将 for i,item in enumerate(l1)
更改为 for i in range(min((len(l1),len(l2)))
可能对您有帮助:
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)
使用 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)]
我需要创建一个“生成器函数”,它将获取 2 个列表并将两个列表中的数字按索引连接成一个元组。例如:
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 iterate_lists(l1,l2):
for i,item in enumerate(l1):
yield l1[i],l2[i]
或作为变量 generator comprehension:
iterate_lists = (li[i],l2[i] for i,item in enumerate(l1))
关于如果长度不相等,我不清楚你到底想做什么,没有消息你可以继续较小的列表...
只需将 for i,item in enumerate(l1)
更改为 for i in range(min((len(l1),len(l2)))
可能对您有帮助:
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)
使用 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)]