2014-07-29 3 views
0

Список players содержит экземпляры класса Players. Я хочу увеличить индекс списка на 1 для каждого цикла, но после того, как он достигнет последнего элемента, он должен начинаться с 0 снова.Велоспорт по списку свыше

В принципе, это код покера, в котором у меня есть X игроков, и я хочу, чтобы они размещали небольшие блайнды (sb) (y сумма денег) и большой блайнд (bb) (2y сумма денег) каждую игру (цикл). Теперь игроки вращаются в каждом раунде. Пример того, что я имею в виду:

Example in 8 player game: 
round1: sb,bb,3,4,5,6,7,8 
round2: 1,sb,bb,4,5,6,7,8 
round3: 1,2,sb,bb,5,6,7,8 
......................... 
round8: bb,2,3,4,5,6,7,sb 
......................... 
Example in 2 player game: 
round1: sb,bb 
round2: bb,sb 
round3: sb,bb 
......................... 

Мой код:

stopNext = True 
while check < 10: 
    newDeck = Deck() 
    [player.generateCard(newDeck) for player in players] # generate cards for each player 
    a, b = itertools.cycle(players), itertools.cycle(players) 
    if stopNext: 
     next(b, None) 
     stopNext = False 
    one = a.next() 
    two = b.next() 
    one.postSB(one.amount, sb) # for each cycle select next instance 
    two.postBB(two.amount, bb) # for each cycle select next instance starting at instance 

Что я получаю с 2 игроками и SB = 1, бб = 2:

Next round 
99 instance : <__main__.Player instance at 0x7f391cce0950> 
98 instance : <__main__.Player instance at 0x7f391cce0998> 
Next round 
96 instance : <__main__.Player instance at 0x7f391cce0950> 
96 instance : <__main__.Player instance at 0x7f391cce0950> 
Next round 
93 instance : <__main__.Player instance at 0x7f391cce0950> 
93 instance : <__main__.Player instance at 0x7f391cce0950> 
Next round 
90 instance : <__main__.Player instance at 0x7f391cce0950> 
90 instance : <__main__.Player instance at 0x7f391cce0950> 
Next round 
87 instance : <__main__.Player instance at 0x7f391cce0950> 
87 instance : <__main__.Player instance at 0x7f391cce0950> 

Но я должен получить:

Next round 
99 
98 
Next round 
97 
97 
Next round 
96 
95 
Next round 
94 
94 
Next round 
93 
92 

Я думаю, что это проблема с тем, как next() используется, как вы можете видеть, начиная с третьего, адрес экземпляра всегда один и тот же.

ответ

0

Мне кажется странным, что вы переопределяете цикл для каждой итерации цикла while. Попробуйте определить g и h вне цикла while и просто вызовите строки с .next внутри цикла. Затем, чтобы запустить h из +1, вызовите .next на него один раз перед входом в цикл.

+0

Хороший улов, это было ошибкой. – estranged

+0

Увидим меня. Я отредактировал, как вы сказали, но почему-то это работает неправильно. Это выглядит хорошо сейчас? Может быть, ошибка в другом месте? – estranged

3

Вы хотите совместить два разных рецепта.

  • cycle, который создает бесконечно повторяющийся итератор, и которая уже является частью itertools.

  • pairwise, который объединяет смежные записи в итераторе по мере необходимости, с definition given in the itertools docs.

Мы можем комбинировать их. pairwise работает, делая два новых итератора из оригинального - вам нужно сделать это, чтобы вызов next на одном не повлиял на другое. Затем он продвигает одну из них по одной записи, и izip с ними вместе. Мы называем это на версии оригинального итератора cycle d, которая присоединяет хвост к голове, предоставляя нам бесконечную версию.

In [6]: import itertools as itt 
     def pairwise(iterable): 
      "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
      a, b = itt.tee(iterable) 
      next(b, None) 
      return itt.izip(a, b) 

In [7]: li = [1,2,3] 
     pli = pairwise(itt.cycle(li)) 

In [8]: pli.next() 
Out[8]: (1, 2) 

In [9]: pli.next() 
Out[9]: (2, 3) 

In [10]: pli.next() 
Out[10]: (3, 1) 

In [11]: # or all at once: 
     list(itt.islice(pli, 5)) 
Out[11]: [(1, 2), (2, 3), (3, 1), (1, 2), (2, 3)] 

В этом случае, однако, мы можем фактически избежать tee, если мы хотим, и объединить их в один присест

In[20]: import itertools as itt 
     def paircycle(iterable): 
      "s -> (s0,s1), (s1,s2), (s2, s3), ... cycling back to the beginning of s" 
      a, b = itt.cycle(iterable), itt.cycle(iterable) 
      next(b, None) 
      return itt.izip(a, b) 

     li2 = [11, 12, 13] 
     list(itt.islice(paircycle(li2),5)) 

Out[20]: [(11, 12), (12, 13), (13, 11), (11, 12), (12, 13)] 
+0

Да, это выглядит хорошо, но трудно понять, что здесь происходит. Попробуй хотя :) – estranged

+0

Спасибо за информативный пост (я многому научился), но это не то, что я хотел. Извините за путаницу, но я редактировал свое оригинальное сообщение о том, чего я пытаюсь достичь. – estranged

Смежные вопросы