【问题标题】:Append a new list from a for loops returned elements从 for 循环返回的元素追加一个新列表
【发布时间】:2018-11-18 00:57:12
【问题描述】:

在将 gamepk 附加到新列表以设置和删除重复项时遇到问题。我的第一个问题只是制作一个新列表。我可以稍后再担心这个设置。

import csv
import requests
import datetime
from pprint import pprint
import pendulum

start = pendulum.datetime(2016, 4, 3)
end = pendulum.datetime(2016, 10, 2)
period = pendulum.period(start, end)

for dt in period.range('days'):
    day = dt.format('DD')
    month = dt.format('MM')
    year = dt.format('YYYY')
    the_date = str(month) + "/" + str(day) + "/" + str(year)

    try:
        req = requests.get('http://gd.mlb.com/components/game/mlb/year_' + str(year) + '/month_' + str(month) + '/day_' + str(day) + '/miniscoreboard.json') # 
        get_gameIds = req.json()['data']['games']['game']

        for gameId in get_gameIds:
            gamepk = gameId['game_pk']
            new_gamepk = []
            for pk in gamepk:                
                new_gamepk.append(pk)
                print(new_gamepk)

在倒数第二个 for 循环之后打印 gamepk 会产生如下列表:

446877
452866
446911
446873
446870
446875
446872
446876
446867
446874
446879
446871

我觉得我应该将 gamepk 结果存储为列表.. 但我不确定。然后我要做的是将所有这些游戏包附加到一个新列表中,然后我可以调用set 并删除重复项。我理解附加的概念,但显然无法让它正常工作。任何帮助和简短的解释都会大有帮助!

【问题讨论】:

    标签: python python-3.x append


    【解决方案1】:

    一般的想法是:

    • 在最外层循环之外初始化一个空集合(列表、集合)
    • 找到所需项目后,将其添加到收藏夹中。

    使用列表

    import csv
    import requests
    import datetime
    from pprint import pprint
    import pendulum
    
    start = pendulum.datetime(2016, 4, 3)
    end = pendulum.datetime(2016, 10, 2)
    period = pendulum.period(start, end)
    
    gamepks = []
    for dt in period.range('days'):
        day = dt.format('DD')
        month = dt.format('MM')
        year = dt.format('YYYY')
        the_date = str(month) + "/" + str(day) + "/" + str(year)
    
        try:
            req = requests.get('http://gd.mlb.com/components/game/mlb/year_' + str(year) + '/month_' + str(month) + '/day_' + str(day) + '/miniscoreboard.json') # 
            get_gameIds = req.json()['data']['games']['game']
    
            for gameId in get_gameIds:
                gamepk = gameId['game_pk']
                gamepks.append(gamepk)
    

    使用集合

    import csv
    import requests
    import datetime
    from pprint import pprint
    import pendulum
    
    start = pendulum.datetime(2016, 4, 3)
    end = pendulum.datetime(2016, 10, 2)
    period = pendulum.period(start, end)
    
    gamepks = set()
    for dt in period.range('days'):
        day = dt.format('DD')
        month = dt.format('MM')
        year = dt.format('YYYY')
        the_date = str(month) + "/" + str(day) + "/" + str(year)
    
        try:
            req = requests.get('http://gd.mlb.com/components/game/mlb/year_' + str(year) + '/month_' + str(month) + '/day_' + str(day) + '/miniscoreboard.json') # 
            get_gameIds = req.json()['data']['games']['game']
    
            for gameId in get_gameIds:
                gamepk = gameId['game_pk']
                gamepks.add(gamepk)
    

    了解范围很重要。一旦循环退出,在内部范围内声明的变量(例如在 for 循环内)“消失”。这可能有助于指导您在哪里初始化要在循环结束后保留​​的变量(在本例中为列表/集)。

    【讨论】:

    • 谢谢@jedwards!在此示例中,我如何继续使用 gamepks 编写脚本。例如如何打印或将其传递给另一个请求?当我尝试打印出来时,我得到了意外的缩进和无效的语法?
    • 这两个错误似乎是尝试复制/粘贴的副作用。我只需使用您拥有的代码并在第一个 for 循环上方添加一个 gamepks = 并手动添加 .append.add 调用。
    • 你是对的,忘记了 try: 部分。使用 set 方法会自动取出所有重复项,对吗?再次感谢!
    • 是的,set.add() 将允许您添加重复项(如不抛出错误),但它会默默地忽略它们。
    • 完美。我很抱歉一直问问题,但我现在应该纠正一个 for 循环,将它们提取回单个字符串以传递给新的 url 请求吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多