【问题标题】:Grabbing values of an array in sets of 100以 100 个为一组抓取数组的值
【发布时间】:2014-10-27 16:57:38
【问题描述】:

在下面的代码中,ids 是一个数组,其中包含您好友列表中所有用户的 steam64 id。现在根据 steam web api 文档,GetPlayerSummaries 只需要 100 个逗号分隔的 steam64 id 的列表。一些用户有 100 多个朋友,而不是每次调用 API 时运行 200 次 for 循环,我想以 100 个 Steam id 为一组获取数组。最有效的方法是什么(就速度而言)?

我知道我可以使用ids[0:100] 来获取数组的前 100 个元素,但是对于一个包含 230 个用户的好友列表,我该如何做到这一点?

def getDescriptions(ids):
    sids = ','.join(map(str, ids)) 
    r = requests.get('http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key='+API_KEY+'&steamids=' + sids)
    data = r.json();
...

【问题讨论】:

标签: python arrays steam-web-api


【解决方案1】:

利用this 答案中的代码,您可以将其分成 100 个(最后一个循环或更少)朋友组。

def chunkit(lst, n):
    newn = int(len(lst)/n)
    for i in xrange(0, n-1):
        yield lst[i*newn:i*newn+newn]
    yield lst[n*newn-newn:]


def getDescriptions(ids):
    friends = chunkit(ids, 3)
    while (True):
        try:
            fids = friends.next()
            sids = ','.join(map(str, fids)) 
            r = requests.get('http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key='+API_KEY+'&steamids=' + sids)
            data = r.json()
            # Do something with the data variable
        except StopIteration:
            break

这将创建分成 3 个(chunkit 的第二个参数)组的迭代器。我选择了 3,因为朋友列表的基本大小是 250。你可以获得更多(规则来自 this 帖子),但这是一个安全的起点。您可以根据需要微调该值。

使用此方法,您的data 值将在每个循环中被覆盖。确保在指示的地方对其进行处理。

【讨论】:

  • 使用此代码def chunksiter(l, chunks): i,j,n = 0,0,0 rl = [] while n < len(l)/chunks: rl.append(l[i:j+chunks]) i+=chunks j+=j+chunks n+=1 return iter(rl) 和将此代码与chunks = 100 一起使用会更容易
【解决方案2】:

我有一个简单的选择,只需减少每个 while/loop 的列表大小,直到用尽:

def getDescriptions(ids):
    sids = ','.join(map(str, ids))
    sids_queue = sids.split(',')
    data = []
    while len(sids_queue) != 0:
        r = requests.get('http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key='+ \
                            API_KEY+'&steamids=' + ','.join(sids_queue[:100])
        data.append(r.json) # r.json without (), by the way
        # then skip [0:100] and reassign to sids_queue, you get the idea
        sids_queue = sids_queue[101:]

【讨论】:

  • @Andy,您显示的文档可能是错误的,因为我尝试了他们的示例,它给了我一个很好的TypeError: 'dict' object is not callable
  • 文档没有错。您的代码会导致此结果(通过循环进行一次迭代):[<bound method Response.json of <Response [200]>>]。此外,您的 .get 会引发此错误:TypeError: cannot concatenate 'str' and 'list' objects
  • @Andy 感谢您发现它。我现在编辑并将join 添加到列表中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多