【问题标题】:zip longest for python 2.7python 2.7的zip最长
【发布时间】:2015-02-07 17:42:43
【问题描述】:

我有 3 个非常大的文件(+100 MB)file_hash、cert_hash 和 url_data 每行都有一个字符串。问题是所有这些文件中的数据大小都不相同。我已经使用 izip_longest 函数一次读取所有这些文件(无法将这些文件加载​​到内存中)但我想迭代它以获得最长的文件(file_hash 最长)并假设来自 cert_hash 的所有数据都已被读取它应该开始服用cert_hash 文件开头的值,类似地,如果 url_data 结束,它也会从头开始读取。我尝试过使用 fillvalue 参数,但它只需要一个值,如果 cert_hash 和 url_data 结束,我想为它们提供不同的值。

【问题讨论】:

    标签: json file python-2.7 zip


    【解决方案1】:

    如果您希望它们重新启动,您应该 cycle cert_hashurl_data。例如:

    >>> from itertools import cycle, izip
    >>> for t in izip("abcdef", cycle("ghi"), cycle("jklm")):
        print t
    
    
    ('a', 'g', 'j')
    ('b', 'h', 'k')
    ('c', 'i', 'l')
    ('d', 'g', 'm')
    ('e', 'h', 'j')
    ('f', 'i', 'k')
    

    请注意,您不再使用izip_longest,因为cycle 是无限的。


    如果您想在结尾而不是开头重新开始,这里是对cycle 等效实现的调整,可以实现这一点:

    >>> def zigzag(iterable):
        """zigzag('ABCD') --> A B C D C B A B C D  ..."""
        forward = []
        for element in iterable:
            yield element
            forward.append(element)
        backward = forward[-2:0:-1]
        while True:
            for element in backward:
                yield element
            for element in forward:
                yield element
    
    
    >>> z = zigzag("ABCD")
    >>> for _ in range(10):
        print next(z)
    
    
    A
    B
    C
    D
    C
    B
    A
    B
    C
    D
    

    【讨论】:

    • 接受了你的答案,但无论如何要以相反的顺序重复它,即:反向循环
    • @RoshanMehta 你的意思是到达终点然后开始倒退而不是回到起点?
    • 是的,这就是我真正想要的行为;)
    • 可能有,但我不知道。开始寻找the itertools recipes,也许吧?还有reversed。它应该重复最后一个元素,还是从倒数第二个开始?
    • 我已经根据文档中为cycle 给出的“等效实现”更新了我的答案;这样做是你想要的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2019-06-22
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    相关资源
    最近更新 更多