我编写了一个程序来编织浮动列表,例如:
l1 = [5.4, 4.5, 8.7]
l2 = [6.5, 7.8]
l3 = [6.7, 6.9]
我想将l1编织成l2:
[5.4, 6.5, 4.5, 7.8, 8.7]
现在我想把它放在一个班级,所以我可以保持这个结果并将l3编织进去:
[5.4, 6.7, 6.5, 6.9, 4.5, 7.8, 8.7]
我写的两个编织两行的功能是:
def Weave_number_rows(row1,row2): #enter 2 rows of numbers as lists
l1 = row1
l2 = row2
woven = sum(zip(l1, l2), ())
print woven
如何使用类保存结果并将下一行编织到其中?
答案 0 :(得分:3)
您的编织功能会删除l2
的最后一个元素;你需要在这里使用itertools.zip_longest()
:
try:
from itertools import zip_longest
except ImportError:
# Python 2
from itertools import izip_longest as zip_longest
def weave_rows(row1, row2):
return [v for v in sum(zip_longest(row1, row2), ()) if v is not None]
请注意,您需要返回,而不是打印输出。 izip_longest()
调用会添加None
占位符,我们需要在压缩后再次从sum()
输出中删除。
现在你可以简单地在第三个列表中编织前两个的输出:
weave(weave(l1, l2), l3)
演示:
>>> weave_rows(l1, l2)
[5.4, 6.5, 4.5, 7.8, 8.7]
>>> weave_rows(weave_rows(l1, l2), l3)
[5.4, 6.7, 6.5, 6.9, 4.5, 7.8, 8.7]
答案 1 :(得分:0)
您编写的函数返回None
,因为不存在return语句。将print
替换为return
和连锁电话。对于不等大小的列表,您可能还需要izip_longest
而不是zip:
使用izip_longest:
from itertools import izip_longest
def weave(l1, l2):
return filter(None, sum(izip_longest(l1, l2), ())
演示
>>> weave(weave(l1, l2), l3)
(5.4, 6.7, 6.5, 6.9, 4.5, 7.8, 8.7)
没有,在最短的争论中拉链:
>>> def weave_shortest(l1, l2):
return sum(zip(l1, l2), ())
>>> weave_shortest(l3, weave_shortest(l1, l2))
(5.4, 6.7, 6.5, 6.9)
答案 2 :(得分:0)
避免递归的另一个解决方案(基于Martijn Pieters代码)是:
try:
from itertools import zip_longest
except ImportError:
# Python 2
from itertools import izip_longest as zip_longest
def weave_two(row1, row2):
return [v for v in sum(zip_longest(row1, row2, fillvalue=None), ()) if v is not None]
def weave_rows(*args):
if len(args) < 2:
return None
current = weave_two(args[0], args[1])
for i in range(2, len(args)):
current = weave_two(current, args[i])
return current
用法:
>>> weave_rows(l1, l2, l3)
[5.4, 6.7, 6.5, 6.9, 4.5, 7.8, 8.7]
答案 3 :(得分:0)
好的,正如人们的评论,开始使用类似乎是一个奇怪的例子,但这样的事情应该有效:
from itertools import zip_longest
class Weaver():
def __init__(self,data):
self.result = data
def weave(data):
self.result = sum(zip_longest(self.result, data),()) # or whatever version
# works best from
# the other answers
w = Weaver(l1)
w.weave(l2)
w.weave(l3)
print(w.result)
这会创建一个Weaver
对象w
,并使用l1
对其进行初始化。然后,您逐个编织其他列表,并在内部存储结果,最后您访问并打印该结果。