使用python中的类保存一个对象

时间:2013-11-29 13:30:10

标签: python class

我编写了一个程序来编织浮动列表,例如:

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 

如何使用类保存结果并将下一行编织到其中?

4 个答案:

答案 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对其进行初始化。然后,您逐个编织其他列表,并在内部存储结果,最后您访问并打印该结果。