for循环到列表理解

时间:2011-03-17 19:31:56

标签: python list-comprehension

嘿所有, 我有一些代码来读取文件中的某些行,并想知道它是否会作为列表推导或生成器表达式/函数运行得更快。如果它运行得更快,代码将如何运行?还在学习Python。谢谢你的帮助

input = open('C:/.../list.txt', 'r')
output = open('C:/.../output.txt', 'w')

x=0

for line in input:
    x = x+1
    if x > 2 and x < 5:
        output.write(line)

列表文件有

1
2
3
4
5

新文件中的输出是

3
4

6 个答案:

答案 0 :(得分:6)

无需列表理解。

output.write(''.join(itertools.islice(inputfile, 2, 4))

答案 1 :(得分:2)

如果你想用发电机做这件事:

output.writelines(line for line in input if 2 < int(line) < 5)

答案 2 :(得分:1)

不是更快,但如果你想使用列表理解:

    output.writelines([line for (x, line) in enumerate(input) if 1 < x < 4])

这假设您正在使用文件位置的实际行数而不是文件中的读取值(根据您的x分配判断为真)。

答案 3 :(得分:0)

你特别询问了生成器与列表理解,但总的来说有一些是解决问题的方法。

生成器版本:

input  = open('input.txt', 'r')
output = open('output.txt', 'w')

def gen() :
    for line in input :
        yield "FOO " + line

for l in gen() :
    output.write(l)

列表理解:

output.writelines("FOO " + line for line in input)

迭代器风格:

class GenClass(object) :
    def __init__(self, _in) :
        self.input = _in

    def __iter__(self):
        return self

    def next(self) :
        line = self.input.readline()
        if len(line) == 0 :
            raise StopIteration
        return "FOO " + line

output.writelines(GenClass(input))

思想:

  • 列表理解将会有所有内容
  • 列表理解将限制代码量(函数在线)
  • 生成器在编码实践中更加灵活
  • 迭代器风格,为您提供最大的灵活性
  • 初始化成本略高(对象)

答案 4 :(得分:0)

找出哪个最快的最佳方法是测试它!

在这段代码中,我假设您关心的是行的值,而不是哪个行号。

import timeit

def test_comprehension():
  input = open('list.txt')
  output = open('output.txt','w')
  [output.write(x) for x in input if int(x) > 2 and int(x) < 5]

def test_forloop():
    input = open('list.txt')
    output = open('output.txt','w')

    for x in input:
        if int(x) > 2 and int(x) < 5:
            output.write(x)

if __name__=='__main__':
    times = 10000

    from timeit import Timer
    t = Timer("test_comprehension()", "from __main__ import test_comprehension")
    print "Comprehension: %s" % t.timeit(times)

    t = Timer("test_forloop()", "from __main__ import test_forloop")
    print "For Loop: %s" % t.timeit(times)

在这里我只是设置了几个函数,一个用列表理解来完成它,另一个用它作为forloop。 timeit模块按指定的次数运行少量代码,对其进行计时并返回运行所花费的时间。因此,如果您运行上面的代码,您将获得以下内容的输出:

理解:0.957081079483 For Loop:0.956691980362

令人沮丧的是,这两种方式大致相同。

答案 5 :(得分:0)

def copyLines(infname, outfname, lines):
    lines = list(set(lines))   # remove duplicates
    lines.sort(reverse=True)
    with open(infname, 'r') as inf, open(outfname, 'w') as outf:
        try:
            i = 1
            while lines:
                seek = lines.pop()
                while i<seek:
                    inf.next()
                    i += 1
                outf.write(inf.next())
                i += 1
        except StopIteration:  # hit end of file
            pass

def main():
    copyLines('C:/.../list.txt', 'C:/.../output.txt', range(3,5))

if __name__=="__main__":
    main()

请注意,只要耗尽所需的行,它就会退出。