gpt4 book ai didi

python将来自不同列表的结果添加到单个列表

转载 作者:行者123 更新时间:2023-11-28 22:40:43 25 4
gpt4 key购买 nike

我需要编写一个函数 zipper(l1, l2, l3) 来接受三个任意长度的列表,其中包含任意类型的元素。

该函数返回一个列表,其中包含这三个列表中的所有元素,这些元素按以下方式排序:列表 1 的元素 1、列表 2 的元素 1、列表 3 的元素 1、列表 1 的元素 2、列表 2 的元素 2等。当列表中的元素用尽时,列表将停止对最终列表做出贡献。

我试过使用这段代码:

def zipper(l1,l2,l3):
results = []
length_1 = len(l1) - 1
length_2 = len(l2) - 1
length_3 = len(l3) - 1
g = True
h = True
t = True
i = 0
while(g and h and t):
if(length_1 <= i and g):
results.append(l1[i])
if(length_2 <= i and h):
results.append(l2[i])
if(length_3 <= i and t):
results.append(l3[i])
if(i > length_1):
g = False
elif(i > length_2):
h = False
elif(i > length_3):
t = False

i += 1
return results

l1 = [1, 2, 3, 4, 5, 6, 7]
l2 = ["a", "b", "c"]
l3 = [[1,2], [1,2,3], "test", 300]

print(zipper(l1, l2, l3))

在这个例子中,结果应该是:

[1, 'a', [1, 2], 2, 'b', [1, 2, 3], 3, 'c', 'test', 4, 300, 5, 6, 7]

最佳答案

这是一种类似于使用 zip_longest 的方法和 filter ,除了它是手动执行的。当然,在实际代码中最好使用标准库函数,但自己实现功能也是一种有趣的学习练习。

此代码将采用任意数量的列表或其他可迭代对象。它从每个可迭代对象创建一个无限生成器。无限生成器产生一个名为 Done 的哨兵对象当可迭代的元素用完时。

我们简单地遍历这些生成器的列表,添加非 Done我们最终的元素 result列表,当所有生成器都产生时停止 Done .

class Done:
pass

def forever(it):
for i in iter(it):
yield i
while True:
yield Done

def zipper(*iterables):
gens = [forever(it) for it in iterables]
result = []
while True:
a = [u for u in [next(g) for g in gens] if u is not Done]
if a == []:
break
result.extend(a)
return result

l1 = [1, 2, 3, 4, 5, 6, 7]
l2 = ["a", "b", "c"]
l3 = [[1,2], [1,2,3], "test", 300]

print(zipper(l1, l2, l3))

输出

[1, 'a', [1, 2], 2, 'b', [1, 2, 3], 3, 'c', 'test', 4, 300, 5, 6, 7]

关于python将来自不同列表的结果添加到单个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33300579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com