【问题标题】:For Loop for n iterations-PythonFor Loop for n 迭代-Python
【发布时间】:2013-06-11 17:15:17
【问题描述】:

我在 python 脚本中有一个简单的 For 循环:

for filename in filenames:
    outline= getinfo(filename)
    outfile.write(outline)

此 For 循环是从 HTML 页面中提取数据的较大脚本的一部分。我有将近 6GB 的 html 页面,想在所有这些页面上尝试之前先进行一些测试。

我已经搜索过,但找不到在 n 次迭代后让我的 For 循环中断的方法(比如说 100 次。)

【问题讨论】:

  • 使用计数器,如果计数器等于 100 则中断。

标签: python python-2.7 for-loop


【解决方案1】:

使用内置函数enumerate(),在 Python 2 和 3 中都可用。

for idx,filename in enumerate(filenames):
    if idx == 100:
        break
    outline= getinfo(filename)
    outfile.write(outline)

也请看this

【讨论】:

    【解决方案2】:
    for filename in filenames[:100]:
        outline= getinfo(filename)
        outfile.write(outline)
    

    列表切片filenames[:100] 会将文件名列表截断为仅前 100 个元素。

    【讨论】:

    • 对于一般迭代器(不一定是列表):for filename in itertools.islice(filenames, 100):.
    • @chepner 在 Python 3 中也有必要吗?
    • 是的;您不能将切片语法与任意迭代器一起使用。
    【解决方案3】:

    我喜欢@kqr 的回答,但只是另一种考虑的方法,而不是取前 100 个,你可以取一个随机的 n many 代替:

    from random import sample
    for filename in sample(filenames, 10):
        # pass
    

    【讨论】:

    • 我认为这是更好的解决方案,只要它没有任何可怕的性能问题。
    • @kqr 我担心的主要问题是再现能力....所以也许折衷办法是取 n 中的 1 代替,这可以通过切片很好地完成,如您的答案所示...而且对于测试仍然更有用...
    • 是的,我也是这么想的,但被丢弃了,因为它可能具有与随机抽样相似的性能。我没有考虑可测试性,但您确实是正确的。
    【解决方案4】:

    为您的 for 循环保留一个计数器。当你的计数器达到 100 时,中断

    counter = 0
    for filename in filenames:
        if counter == 100:
            break
        outline= getinfo(filename)
        outfile.write(outline)
        counter += 1
    

    【讨论】:

    • 保留计数器的首选方法是for (counter, filename) in enumerate(filenames)
    猜你喜欢
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    相关资源
    最近更新 更多