【问题标题】:Python List Comprehensions - Join with For loopPython List Comprehensions - Join with For 循环
【发布时间】:2016-08-04 06:26:02
【问题描述】:

我正在尝试生成如下 URL:

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

我正在使用 Python 生成 2000 年到 2015 年的 URL,并为此编写了以下代码 sn-p:

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。我做错了什么?我该如何解决这个问题?

【问题讨论】:

    标签: python python-3.x for-loop list-comprehension


    【解决方案1】:

    您可以使用如下更简洁、更强大的字符串格式,

    fmt = "http://ergast.com/api/f1/{y}/qualifying?limit=10000"
    urls = [fmt.format(y=y) for y in range(2000, 1016)]
    

    在您的代码中,str.join 的使用是有问题的,因为它的语义与您尝试完成的不同。 s.join(ls),通过strs加入listls的项目。如果 ls = [l1, l2 ,...] ,则返回 str(l1) + s + str(l2) + s..

    【讨论】:

    • 我喜欢这个答案。它优雅而紧凑。有没有办法我可以稍微改变一下语法并扩展它以用一堆其他属性/API参数替换“限定”?我希望能够按年为“合格”、“结果”和大约 10 个更多参数生成大量 URL。我该怎么做?
    • 知道了!使用itertools.product。 :D
    【解决方案2】:

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

    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 的 cmets 在 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 单独传递给 requests.get(),对吗? :)
    【解决方案3】:

    很高兴了解它发生的原因。 你需要了解join函数,看docs

    将单词列表或元组与中间出现的单词连接起来 九月。

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

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

    【讨论】:

      【解决方案4】:

      不要使用 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(...) 将所有这些连接到一个大字符串中,只要你喜欢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-03
        • 1970-01-01
        • 2016-06-02
        • 1970-01-01
        • 2015-10-23
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        相关资源
        最近更新 更多