作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要编写一个函数 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/
我是一名优秀的程序员,十分优秀!