0

在下面的代码中,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();
...
4

2 回答 2

0

利用答案中的代码,您可以将其分成 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。你可以获得更多(来自这篇文章的规则),但它是一个安全的起点。您可以根据需要微调该值。

使用此方法,您的data值将在每个循环中被覆盖。确保你在指定的地方用它做一些事情。

于 2014-10-27T17:26:40.597 回答
-1

我有一个简单的选择,只需减少每个列表的大小,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:]
于 2014-10-27T17:31:33.987 回答