我有一个URL列表,其中某些URL可能无效。我想从一个随机选择的URL收集图像。如果URL或图像无效,则get_image_from_url
函数将返回None
。因此,我要重复行get_image_from_url(random.choice(urls))
,直到它不返回None
。因为urls
可能是一个很大的列表,所以我不想为以前的完整列表过滤掉无效的url。我做了以下事情:
image = None
while not image:
image = ImageNetUtilities.get_image_from_url(random.choice(urls))
return image
我想知道是否有更好的(更Python化的)方法来实现我的目标。我正在使用Python3。
编辑
根据评论中的建议,我应该删除所有已经选择的网址。我替换了
image = ImageNetUtilities.get_image_from_url(random.choice(urls))
与
image = ImageNetUtilities.get_image_from_url(urls.pop(random.randrange(len(urls))))
答案 0 :(得分:2)
一个版本,1)如果所有 URL均无效,则可避免无限循环; 2)仅对每个URL进行一次测试; 3)使用凉爽的Python功能的版本如下:
image = next(filter(None, map(ImageNetUtilities.get_image_from_url, random.sample(urls, k=len(urls)))))
您也可以事先random.sample(urls, k=len(urls))
来代替random.shuffle
。
要对此加以区分:
random.sample(urls, k=len(urls))
会随机生成随机排列的列表版本map(ImageNetUtilities.get_image_from_url, ...)
生成一个生成器,该生成器将ImageNetUtilities.get_image_from_url
依次应用于每个URL filter(None, ...)
从None
生成器中删除所有map
值next(...)
迭代此生成器并返回第一个值,如果没有有效的URL,则引发StopIteration
异常