2016-05-09 6 views
0

Я пытаюсь написать эту функцию C# в Python, к сожалению, у меня есть это ОШИБКА: IndexError: list assignment index out of range в Population.BinaryX.insert([i][j], dec) линия. Может ли кто-нибудь сказать мне, как я могу исправить эту проблему ?! Что случилось, я сделал?IndexError in array PYTHON

C# Код:

public class Population 
    { 
     public float[] CodedX = new float[20]; 
     public float[,] BinaryX = new float[10, 8]; 
    } 

private void BinaryTranslating() 
     { 
      int dec; 
      int j = 0; 
      for (var i = 0; i < 10; i++) 
      { 
       while (Population.CodedX[i] > 1 & j < 8) 
       { 
        dec = (int)Population.CodedX[i] % 2; 
        Population.BinaryX[i, j] = dec; 
        Population.CodedX[i] /= 2; 
        j++; 
       } 
       j = 0; 
      } 
     } 

private void DecimalTranslating() 
     { 
      for (var i = 0; i < 10; i++) 
      { 
       Population.CodedX[i] = Population.BinaryX[i, 7] * 128 + Population.BinaryX[i, 6] * 64 + 
             Population.BinaryX[i, 5] * 32 + Population.BinaryX[i, 4] * 16 + 
             Population.BinaryX[i, 3] * 8 + Population.BinaryX[i, 2] * 4 + 
             Population.BinaryX[i, 1] * 2 + Population.BinaryX[i, 0]; 

      } 
     } 

Python КОД:

class Population: 
CodedX = [] 
BinaryX = [[], []] 

class Application: 
@staticmethod 
    def binary_translating(): 
     j = 0 
     for i in range(10): 
      while Population.CodedX[i] > 1 & j < 8: 
       dec = int(Population.CodedX[i]) % 2 
       Population.BinaryX.insert([i][j], dec) 
       Population.CodedX[i] /= 2 
       j += 1 
      j = 0 

@staticmethod 
    def decimal_translating(): 
     for i in range(10): 
      new_item = Population.BinaryX[i][7] * 128 + Population.BinaryX[i][6] * 64 + Population.BinaryX[i][5] * 32 +\ 
         Population.BinaryX[i][4] * 16 + Population.BinaryX[i][3] * 8 + Population.BinaryX[i][2] * 4 +\ 
         Population.BinaryX[i][1] * 2 + Population.BinaryX[i][0] 
      Population.CodedX.insert(i, new_item) 
+1

Вы не должны использовать побитовое И для булевы, используйте правильный "и" оператор в Python. – zoubida13

+1

Можете ли вы показать нам, как вы определяете «Population.BinaryX»? – tdelaney

+0

Можете ли вы разместить образец для CodedX? и что такое BinaryX? – WreckeR

ответ

1

пожалуйста, убедитесь, что Population.BinaryX является допустимым сущностью и содержит по меньшей мере 10 элементов, потому что вы выполняете цикл 10 раз. То же самое касается CodedX.

Если какой-либо из них не имеют по крайней мере, 10 элементов, вы получите

IndexError: list assignment index out of range

Попробуйте ..

class Population: 
    CodedX = [0 for i in range(10)] 
    BinaryX = [[0 for i in range(10)] for j in range(10)] 

Это предварительное выделение, как упомянуто tdelaney.

Если вы посмотрите на каждый из функций класса Application, они пытаются использовать массивы BinaryX или CodedX, но если в этих массивах нет элементов, то как они будут индексироваться в python?

Я хочу сказать, что перед вызовом функции decimal_translating()Population.BinrayX должен иметь в себе элементы. Он не может быть пустым массивом.

Аналогичным образом, перед вызовом функции binary_translating()Population.CodedX должен иметь в себе элементы.

[править # 1] После ваших комментариев и пытаясь понять ваш code.Here что у меня есть: -

class Population(object): 
    def __init__(self): 
     self.CodedX = [0 for i in range(10)] # as per your C# code 
     self.BinaryX = [] 
     # debug code to fill CodedX array - remove it 
     for i in range(10): 
      self.CodedX[i] = int(761) 

    def binary_translating(self): 
     for i in range(10): 
      j = 0 
      self.BinaryX.append([0 for k in range(10)]) 
      while (self.CodedX[i] > 0) and (j < 10): 
       dec = int(self.CodedX[i] % 2) 
       self.BinaryX[i][j] = dec # this will append at j 
       self.CodedX[i] = int(self.CodedX[i]/2) 
       j += 1 
     # debug code to print - remove it 
     print(self.BinaryX) 
     # debug code to clear CodedX - remove it 
     for i in range(10): 
      self.CodedX[i] = int(0) 

    def decimal_translating(self): 
     for i in range(10): 
      value = self.BinaryX[i][7] * 128 + self.BinaryX[i][6] * 64 + self.BinaryX[i][5] * 32 + \ 
          self.BinaryX[i][4] * 16 + self.BinaryX[i][3] * 8 + self.BinaryX[i][2] * 4 + \ 
          self.BinaryX[i][1] * 2 + self.BinaryX[i][0] 
      self.CodedX[i] = value 
     print(self.CodedX) 


pop = Population() 

pop.binary_translating() 
pop.decimal_translating() 

Я добавил некоторые отладки кода, чтобы иметь некоторые начальные значения в CodedX и распечатайте заявления, чтобы увидеть результат.

формирует выходной сигнал:

[[1, 0, 0, 1, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 1, 1, 1, 0, 1]] 

[249, 249, 249, 249, 249, 249, 249, 249, 249, 249] 

[редактировать # 2]this is what i meant by the conversion precision

+0

Здравствуйте @Mrunmoy Я проверил программу прямо сейчас, и у меня есть элементы в Population.CodedX. Также я заметил, что интересно, когда я писал «BinaryX = [[0 для i в диапазоне (10)] для j в диапазоне (10)]' он работает, но когда я написал как «BinaryX = [[0 для i в диапазоне (8)] для j в диапазоне (10)] 'он не работал. Поэтому я немного смущен этим. У тебя есть идеи?! –

+0

Кстати, 'Population.BinrayX' я использую первый раз в' binary_translating() 'функции, так что в любом случае он пуст при запуске. Что делать по этому поводу? –

+0

Как я понимаю, мне нужно добавить элемент в 'Population.BinrayX', но как использовать .append для многомерного массива в этой причине ?! –

3

Рассмотрим выражение [i][j] в Population.BinaryX.insert([i][j], dec). Это выражение создает список из 1 элемента, содержащий значение i, а затем пытается взять j-й элемент из этого списка.

>>> i=1 
>>> j=2 
>>> [i][j] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: list index out of range 

списки Python являются одномерными, и если вы хотите многомерный список, вам нужно создать список списков или использовать какую-либо другую структуру, такие как массив numpy или pandas.

Одним из вариантов является предварительно выделить массив с известным значением, так что вы можете просто индекс позже

@staticmethod 
def binary_translating(): 
    Population.BinaryX = [[None] * 8 for _ in range(10)] 
    j = 0 
    for i in range(10): 
     while Population.CodedX[i] > 1 & j < 8: 
      dec = int(Population.CodedX[i]) % 2 
      Population.BinaryX[i][j] = dec 
      Population.CodedX[i] /= 2 
      j += 1 
     j = 0 

Другой вариант вставить в подсписка:

@staticmethod 
def binary_translating(): 
    Population.BinaryX = [] 
    j = 0 
    for i in range(10): 
     Population.BinaryX.insert([]) 
     while Population.CodedX[i] > 1 & j < 8: 
      dec = int(Population.CodedX[i]) % 2 
      Population.BinaryX[i].insert(j, dec) 
      Population.CodedX[i] /= 2 
      j += 1 
     j = 0 
+0

. Я пытаюсь использовать вашу первую версию, и у меня есть вопрос, мы можем написать так: «Population.BinaryX [i] [j ] = dec' Он дает 'IndexError: индекс назначения списка вне диапазона' Что вы думаете об этом? –

+0

Можете ли вы проверить мое сообщение снова PLS. Я обновил его с новой функцией, связанной с последней, алосом, где я определил «Population.BinaryX». –

+0

@NurzhanNogerbek - Я некоторое время был на своем компьютере ... рад видеть, что другой ответ проработал это для вас! – tdelaney