2014-10-27 1 views
0

В приведенном ниже коде ids представляет собой массив, содержащий идентификаторы steam64 всех пользователей в вашем списке друзей. Теперь в соответствии с документацией на паровой веб-авию, GetPlayerSummaries принимает только список из 100 разделенных запятыми идентификаторов steam64. Некоторые пользователи имеют более 100 друзей, и вместо того, чтобы запускать цикл for 200 раз, каждый раз вызывающий API, я хочу взять массив в наборах из 100 парных идентификаторов. Какой был бы самый эффективный способ сделать это (с точки зрения скорости)?Захват значений массива в наборах 100

Я знаю, что могу сделать 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(); 
... 
+1

возможно дубликат [Перебор итератор кусками (п) в Python?] (HTTP: // StackOverflow .com/questions/8991506/iterate-an-iterator-by-chunks-of-n-in-python) –

ответ

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 будет перезаписано каждым циклом. Убедитесь, что вы что-то сделали с ним в указанном месте.

+0

будет проще использовать этот код 'def chunksiter (l, chunks): i, j, n = 0,0,0 rl = [] в то время как n

-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:] 
+0

[запросы] (http://docs.python-requests.org/en/latest/) - это 'json()'. – Andy

+0

@ Энди, ты пробовал? – Anzel

+0

@ Andy. Документ, который вы показываете, вероятно, неверен, поскольку я пытаюсь их пример, и это дает мне хороший объект 'TypeError: 'dict' не вызываемый' – Anzel