如何在python中打印列表推导的进度?

时间:2018-06-08 08:02:42

标签: python list list-comprehension

在我的方法中,我必须在列表中返回一个列表。我希望有一个列表理解,因为该列表需要大约5分钟才能创建。

[[token.text for token in document] for document in doc_collection]

是否有可能打印出进度,创建过程当前在哪个文件中?这样的事情:

[[token.text for token in document] 
  and print(progress) for progress, document in enumerate(doc_collection)]

感谢您的帮助!

6 个答案:

答案 0 :(得分:8)

您可以使用辅助功能:

def report(tok, index):
    if index % 1000 == 0:
        print(index)

def process(tok, index, report=None):
    if report:
        report(tok, index) 
    return tok['text']

l1 = [{'text': k} for k in range(5000)]

l2 = [process(tok, index, report) for index, tok in enumerate(l1)]

打印:

0
1000
2000
3000
4000

答案 1 :(得分:3)

from __future__ import division

我不认为这个好的或可读的代码,但这个想法很有趣。

它有效,因为doc_collection = [[1, 2], [3, 4], [5, 6]] result = [print(progress) or [str(token) for token in document] for progress, document in enumerate(doc_collection)] print(result) # [['1', '2'], ['3', '4'], ['5', '6']] 始终返回print,因此None始终为print(progress) or x(根据x的定义。)

答案 2 :(得分:1)

def show_progress(it, milestones=1):
    for i, x in enumerate(it):
        yield x
        processed = i + 1
        if processed % milestones == 0:
            print('Processed %s elements' % processed)

只需将此功能应用于您正在迭代的任何内容。如果你使用循环或列表理解并没有关系,并且它很容易在几乎没有代码更改的任何地方使用。例如:

doc_collection = [[1, 2],
                  [3, 4],
                  [5, 6]]

result = [[str(token) for token in document]
          for document in show_progress(doc_collection)]

print(result)  # [['1', '2'], ['3', '4'], ['5', '6']]

如果您只想显示每100个文档的进度,请写:

show_progress(doc_collection, 100) 

答案 3 :(得分:0)

我需要使@ted的答案(imo)更具可读性,并添加一些解释。

已解决的解决方案:

# Function to print the index, if the index is evenly divisable by 1000:
def report(index):
    if index % 1000 == 0:
        print(index)

# The function the user wants to apply on the list elements
def process(x, index, report):
     report(index) # Call of the reporting function
     return 'something ' + x # ! Just an example, replace with your desired application

# !Just an example, replace with your list to iterate over
mylist = ['number ' + str(k) for k in range(5000)]

# Running a list comprehension
[process(x, index, report) for index, x in enumerate(mylist)]
enumerate(mylist)

说明::使用函数enumerate,除了可迭代对象的元素之外,还可以具有索引(请参阅this question and its answers )。例如

[(index, x) for index, x in enumerate(["a", "b", "c"])] #returns
[(0, 'a'), (1, 'b'), (2, 'c')]

注意indexx不是保留名称,只是我觉得方便的名称-[(foo, bar) for foo, bar in enumerate(["a", "b", "c"])]产生相同的结果。

答案 4 :(得分:0)

这是我的实现方式。

pip install progressbar2

from progressbar import progressbar
new_list = [your_function(list_item) for list_item in progressbar(old_list)]`

运行上面的代码块时,您将看到一个进度条。

答案 5 :(得分:0)

就去做:

from time import sleep
from tqdm import tqdm

def foo(i):
    sleep(0.01)
    return i

[foo(i) for i in tqdm(range(1000))]

对于 Jupyter 笔记本:

from tqdm.notebook import tqdm