Python列表理解与For循环连接

2024-04-24 21:58:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试生成如下URL:

http://ergast.com/api/f1/2000/qualifying?limit=10000

我正在使用Python生成2000年到2015年的url,为此,我编写了以下代码片段:

url = "http://ergast.com/api/f1/"
year = url.join([str(i) + "/qualifying?limit=10000" + "\n" for i in range(1999, 2016)])
print(year)

输出为:

1999/qualifying?limit=10000
http://ergast.com/api/f1/2000/qualifying?limit=10000
http://ergast.com/api/f1/2001/qualifying?limit=10000
http://ergast.com/api/f1/2002/qualifying?limit=10000
http://ergast.com/api/f1/2003/qualifying?limit=10000
http://ergast.com/api/f1/2004/qualifying?limit=10000
......
http://ergast.com/api/f1/2012/qualifying?limit=10000
http://ergast.com/api/f1/2013/qualifying?limit=10000
http://ergast.com/api/f1/2014/qualifying?limit=10000
http://ergast.com/api/f1/2015/qualifying?limit=10000

如何摆脱第一条线?我试着做了这个范围(2000年,2016年),但是同样的事情发生了,第一行是2000年,而不是1999年。我做错什么了?我该怎么解决?


Tags: 代码incomapihttpurlforyear
3条回答

很高兴知道为什么会这样。 要了解join函数,请查看docs

Concatenate a list or tuple of words with intervening occurrences of sep.

这意味着url参数将在要连接的单词之间重复,这将导致上面的输出,第一个元素没有url。 你想要的不是使用join,而是连接字符串,就像你已经在处理年份一样。

为此,您可以使用不同的方法,正如已经回答过的那样。 您可以使用@AKS指出的字符串格式,它应该可以工作。

可以为此使用字符串格式:

url = 'http://ergast.com/api/f1/{0}/qualifying?limit=10000'

print('\n'.join(url.format(year) for year in range(2000, 2016)))

# http://ergast.com/api/f1/2000/qualifying?limit=10000
# http://ergast.com/api/f1/2001/qualifying?limit=10000
# ...
# http://ergast.com/api/f1/2015/qualifying?limit=10000

更新:

基于OP在requests.get中传递这些URL的注释:

url_tpl = 'http://ergast.com/api/f1/{0}/qualifying?limit=10000'

# use list coprehension to get all the urls
all_urls = [url_tpl.format(year) for year in range(2000, 2016)]

for url in all_urls:
    response = requests.get(url)

使用列表理解来创建不同的URL,而不是使用URL来连接字符串。

>>> ["http://ergast.com/api/f1/%d/qualifying?limit=10000" % i for i in range(1999, 2016)]
['http://ergast.com/api/f1/1999/qualifying?limit=10000',
 'http://ergast.com/api/f1/2000/qualifying?limit=10000',
 ...
 'http://ergast.com/api/f1/2014/qualifying?limit=10000',
 'http://ergast.com/api/f1/2015/qualifying?limit=10000']

然后您仍然可以使用'\n'.join(...)将所有这些连接到一个大字符串中,这是您喜欢的。

相关问题 更多 >