Как нумеровать двумерный список? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть эти списки внутри списка, который я пытаюсь нумеровать.У меня также есть две переменные, строка и столбец, которые принимаются в качестве входных данных.

lst = row*[column*[0]]

Это создает списки внутри списка, заполненные нулями, поэтому, если строка = 6 и столбец = 10, это будет выглядеть так:

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

Как я могу изменить еготак это выглядит так:

[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],   
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20],     
[21, 22, 23, 24, 25, 26, 27, 28, 29, 30],    
[31, 32, 33, 34, 35, 36, 37, 38, 39, 40],     
[41, 42, 43, 44, 45, 46, 47, 48, 49, 50],     
[51, 52, 53, 54, 55, 56, 57, 58, 59, 60]]

Спасибо!

Ответы [ 7 ]

0 голосов
/ 28 февраля 2019

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

Кроме того, учитывая ваш очевидный уровень опыта, я думаю, что процедурный подход может бытьхорошее начало для вас.

# Your given information
row = 6
col = 10

# Initialize an empty list of lists
lst = []

# Continuously append lists by converting range() objects
i = 1
while i <= (row * col):
  next_i = i + col
  arr.append(list(range(i, next_i)))
  i = i + next_i

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

Примечание: комментарий к вашему вопросу гласит:

Вы случайно создали список с кучей ссылок на тот же внутренний список .

Чтобы проиллюстрировать это, рассмотрим, что происходит в интерактивном интерпретаторе python, когда я пытаюсь изменить (изменить) один элемент списка списков:

>>> row = 6
>>> column = 10
>>> lst = row*[column*[0]]
>>> lst
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
>>> lst[0][0] = 999 # set just row 0, column 0 to 999
>>> lst
[[999, 0, 0, 0, 0, 0, 0, 0, 0, 0], [999, 0, 0, 0, 0, 0, 0, 0, 0, 0], [999, 0, 0, 0, 0, 0, 0, 0, 0, 0], [999, 0, 0, 0, 0, 0, 0, 0, 0, 0], [999, 0, 0, 0, 0, 0, 0, 0, 0, 0], [999, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

В результате получается, чтопервый столбец каждой строки был изменен на 999. Это потому, что когда вы "умножили" list, созданный на [column*[0]] на row, на самом деле вы получили row экземпляровтого же list.Поэтому, когда вы ссылаетесь на одного из них, вы обращаетесь ко всем из них, таким образом.Будьте осторожны с этим видом «умножения списков».

0 голосов
/ 28 февраля 2019

Это тоже работает:

lst = [list(range(1+i*column, 1+(i+1)*column)) for i in range(row)]

Вывод:

print (lst)
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [31, 32, 33, 34, 35, 36, 37, 38, 39, 40], [41, 42, 43, 44, 45, 46, 47, 48, 49, 50], [51, 52, 53, 54, 55, 56, 57, 58, 59, 60]]

Объяснение:

  1. Мы создаем внешний список, в котором каждый элемент является (внутренним) списком int.
  2. Понимание списка строит внешний список.
  3. Выражение перед forцикл, равный list(range(1+i*column, 1+(i+1)*column)), представляет каждый элемент этого внешнего списка.Этот элемент, представляющий собой список int, сначала создается как объект диапазона с использованием range(1+i*column, 1+(i+1)*column).Объект диапазона, возвращаемый этим, затем передается в list() для преобразования его в список.

Обратите внимание, что выражение range(1+i*column, 1+(i+1)*column) является интуитивным , потому что оно отражаетДело в том, что в i-й строке значения будут «колебаться» от (1+i*column) to 1+(i+1)*column.Например, в случае 6x10, когда i = 2, значения соответствующей строки будут «колебаться» от 1+2*10 до 1+(2+1)*10.

0 голосов
/ 28 февраля 2019

Я думаю, что это был бы самый "питонический" способ:

from pprint import pprint

rows = 6
cols = 10

lst = [[(j*cols+i) for i in range(1,cols+1)] for j in range(rows)]

pprint(lst)

Вывод:

[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
 [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
 [21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
 [31, 32, 33, 34, 35, 36, 37, 38, 39, 40],
 [41, 42, 43, 44, 45, 46, 47, 48, 49, 50],
 [51, 52, 53, 54, 55, 56, 57, 58, 59, 60]]
0 голосов
/ 28 февраля 2019

Вы можете получить это, используя zip и range.

list(zip(*[iter(range(1, row*column+1))]*column))

Это приводит к списку кортежей, но если вам нужен список списков, просто map list to zip

list(map(list, zip(*[iter(range(1, row*column+1))]*column)))

Результаты:

[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47, 48, 49], [50, 51, 52, 53, 54, 55, 56, 57, 58, 59]]

0 голосов
/ 28 февраля 2019

Почему бы не использовать списочное понимание следующим образом:

lst = [[(i+j*column)+1 for i in range(column)] for j in range(row)]
0 голосов
/ 28 февраля 2019

Попробуйте это:

l = []
for i in range(0, 6):
    row = []
    for j in range(1,11):
        row.append(i*10+j)
    l.append(row)
l
>>>[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
   [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
   [21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
   [31, 32, 33, 34, 35, 36, 37, 38, 39, 40],
   [41, 42, 43, 44, 45, 46, 47, 48, 49, 50],
   [51, 52, 53, 54, 55, 56, 57, 58, 59, 60]]
0 голосов
/ 28 февраля 2019

Быстрое и грязное решение было бы:

lst = []
for r in range(row):
    lst.append([])
    for c in range(column):
        lst[r].append(c + r * column)

Это может быть реализовано более аккуратно, используя numpy и изменяющий форму, как:

lst = numpy.arange(row * column).reshape(row, column).tolist()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...