在我的方法中,我必须在列表中返回一个列表。我希望有一个列表理解,因为该列表需要大约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)]
感谢您的帮助!
答案 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')]
注意:index
和x
不是保留名称,只是我觉得方便的名称-[(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