2016-02-19 1 views
2

Файл данных - это список Excel с 4 столбцами: имя, должность, значение и цена. Файл, импортированный с помощью pandas.Быстрые/более умные петли [Python]

Существует 5 различных положений.

Я стараюсь соответствовать всем различным возможностям, где он может быть только одним из каждой позиции + одним случайным игроком, который еще не выбран.

def teams(x): 
    positions = list(data.Position.unique()) 
    indices = [] 
    for position in positions: 
     indices.append((data.Position == position).nonzero()[0]) 

    positions.append('Random') 
    indices.append(data.index) 


    for i in indices[0]: 
     for i2 in indices[1]: 
      for i3 in indices[2]: 
       for i4 in indices[3]: 
        for i5 in indices[4]: 
         for i6 in indices[5]: 
          if i6 != i: 
           if i6 != i2: 
            if i6 != i3: 
             if i6 != i4: 
              if i6 != i5: 
               print i, i2, i3, i4, i5, i6 

teams(data) 

Моя проблема заключается в том, что мои петли слишком медленно, и я не могу получить if заявление на работу, так что я должен сделать 5 различных if с, что я предполагаю, что это довольно глупо решение.

Мой вопрос: как я могу сделать мои петли быстрее/умнее и как это исправить мое if заявление

+1

вы можете сделать 'if i6 не в [i, i2, i3, i4, i5]' для операторов if – SirParselot

+1

Сколько элементов в каждом индексе? – SirParselot

+0

atm его около 10 в ожидании последнего, который имеет около 50 – Svelic

ответ

6

Вы можете сократить свой код на три строки, если вы используете itertools.product() как так

from itertools import product 

for i in list(product(*indices)): 
    if i[5] not in i[:5]: 
     print i[0], i[1], i[2], i[3], i[4], i[5] 

product() эквивалентен вложенным для циклов

+0

, этот код действительно короче, но его все еще очень медленный. Есть ли способ сделать это быстрее? – Svelic

+1

@Svelic Я не могу придумать другого способа сделать это. Если каждый индекс имеет 10 элементов, а у последнего - 50, то вы смотрите на 5 миллионов возможностей. Кэширование может быть вариантом, но я не вижу, как применить его к этой проблеме. сожалею – SirParselot