在下面的代码中,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();
...
答案 0 :(得分:0)
利用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
值。确保你在指定的地方做了些什么。
答案 1 :(得分:-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:]