Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > странности с массивами!


Автор: RM2010 19.3.2010, 19:57
Ребята, привет.
Есть массив figbox который, по сути надо обработать нижеследующим алгоритмом.

       
Код

 a=figbox

        figbox[0]=a[8];   figbox[1]=a[4];   figbox[2]=a[0];   figbox[3]=0
        figbox[4]=a[9];   figbox[5]=a[5];   figbox[6]=a[1];   figbox[7]=0
        figbox[8]=a[10];  figbox[9]=a[6];   figbox[10]=a[2];  figbox[11]=0
        figbox[12]=0;     figbox[13]=0;     figbox[14]=0;     figbox[15]=0



то есть на 0ое место поставить то, что было на 8м, на 1ое то, что было на 4ом, на 2ое, то что было на 0им и т.д.
но почему-то сие не работает и оно пытается так же изменить временный массив 'a' и на выходе получается какой-то компот.

Автор: ToshaCh 20.3.2010, 15:29
А все питонисты такие недоброжелательные? Между прочим парень отметил самую непонятную для новичка вещь в пистоне, а вы его посту лепите минусы.

Фишка здесь в том, что знак = в питоне не является оператором присваиванивая, точнее он не всегда работает так. В данном случае это создание алиаса. Штудируй документацию, как сделать через ж... по уму. smile


Автор: Gunjy 20.3.2010, 19:09
Поскольку массивов как таковых в Python нет, то можно попробовать использовать словари.

Создаём и заполняем временный словарь

Код

a = {} # Создаём временный словарь

for i in range(16): # Заполняем его таким образом, что 3-й, 7-й, а также элементы, начиная с 11-го равны нулю

    if i == 3 or i == 7 or i >= 11:
        a[i] = "zero"
    else:
        a[i] = "value" + str(i)
        

I = [8,4,0,3,9,5,1,7,10,6,2,11,12,13,14,15] 
# Создаём список ключей словаря a, в порядке, в котором они будут использоваться при заполнении нового словаря

figbox = {}

for i in range(16): # Заполняем наш новый словарь по порядку от 0 до 15, использую список I
    figbox[i] = a[I[i]]



В итоге получаем словарь a:

Код

{0: 'value0', 1: 'value1', 2: 'value2', 3: 'zero', 4: 'value4', 5: 'value5', 
6: 'value6', 7: 'zero', 8: 'value8', 9: 'value9', 10: 'value10', 
11: 'zero', 12: 'zero', 13: 'zero', 14: 'zero', 15: 'zero'}


Словарь figbox:

Код

{0: 'value8', 1: 'value4', 2: 'value0', 3: 'zero', 4: 'value9', 5: 'value5', 
6: 'value1', 7: 'zero', 8: 'value10', 9: 'value6', 10: 'value2', 11: 'zero', 
12: 'zero', 13: 'zero', 14: 'zero', 15: 'zero'}

Автор: Fenrir13 21.3.2010, 08:48
Код a = fightbox на самом деле создаёт в a ссылку на fightbox. Для копирования массива можно явно присваивать копию: a = fightbox[:] Запись индекса в виде [:] означает "все элементы".

Автор: RM2010 24.3.2010, 18:50
Ребята, спасибо! Сделал вот так:
Код

a=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]           ### creating temp.array
            for i in range(len(figbox)): a[i]=figbox[i]   ### assing values from 'figbox' to temp
            figbox[0]=a[8];   figbox[1]=a[4];   figbox[2]=a[0];   figbox[3]=0   ### turn everything right
            figbox[4]=a[9];   figbox[5]=a[5];   figbox[6]=a[1];   figbox[7]=0   ### turn everything right
            figbox[8]=a[10];  figbox[9]=a[6];   figbox[10]=a[2];  figbox[11]=0   ### turn everything right
            figbox[12]=0;     figbox[13]=0;     figbox[14]=0;     figbox[15]=0   ### turn everything right


А общий результат можно увидеть вот здесь! http://forum.vingrad.ru/forum/act-ST/f-79/t-294287/unread-1.html

user posted image

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)