2015-12-04 5 views
0

У меня есть массив: table = [[ 1 for x in range(1, 101)] for x in range(1, 101)]Как изменить часть массива

Теперь я хочу установить некоторые элементы 0. Конечно, я мог бы итерацию по таблице и выбрать элементы, которые я хочу изменить, но это не имеет особого смысла, когда я хочу, чтобы изменить 25 элементов выхода из 10000. Так вот мой код:

left = randint(1,100) 
table[left+1:left+3][left+1:left+3] = [[ 0 for x in range(1,3)] for x in range(1, 3)] 

Однако, когда я просуммировать все клетки моего массива:

sum(map(sum, table)) 

Я получаю 10 000.

В чем проблема с этим соглашением и каков его правильный способ?

Я использую Python 2.7 и PyCharm для Windows.

И почему следующая строка:

print len(table[left-1:left+6][upper-1:upper+6]) 

печатает 0?

+1

FYI, нет никаких массивов в python. Вы говорите о списках. –

+0

@ Lafexlos, спасибо. Но это действительно не имеет значения. Он все еще не работает, когда я устанавливаю часть списка на 0. – user2738748

ответ

2

У вас есть список 100x100, этой линией

table[left+1:left+3] 

Вы выбираете списки слева + 1 налево + 3, так что результат будет список 2x100. Так что, если ваша переменная left больше 1 эта строка будет пытаться получить списки из диапазона:

table[left+1:left+3][left+1:left+3] 

результат будет, вероятно:

[] 

Пример:

table = [ 
    [1, 2, 3, 4], 
    [5, 6, 7, 8], 
    [9, 10, 11, 12], 
    [13, 14, 15, 16] 
] 

поэтому результат:

table[2:4] 

является

[[9, 10, 11, 12], [13, 14, 15, 16]] 

если вы пытаетесь получить диапазон [2: 4] из этого списка вы не получите ничего, потому что он содержит только 2 списка:

[] 

/Edit: переехал из комментария, который не поддерживает форматирование кода:

Чтобы ответить на главный вопрос. Я думаю, что неплохое решение будет:

for row in table[left:left+5]: 
    row[right:right+5] = [0 for x in range(5)] 
+0

Спасибо, это логично :) – user2738748

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