добавление в список 2D в Python, где длина строки / столбца неизвестна - PullRequest
2 голосов
/ 26 октября 2011

Я хочу перевернуть строки и столбцы в 2D-списке и столкнулся с проблемой.Python не позволяет присваивать значение неинициализированной «ячейке».Я не уверен, как инициализировать мою сетку, так как я не знаю длину заранее.Следующее:

data = list()
maReader = csv.reader(open('TEST.csv', 'rb'), delimiter=',', quotechar='"')
for rindex, row in enumerate(maReader):
    for iindex, item in enumerate(row):
        data[iindex][rindex] = item

завершается с ошибкой «IndexError: индекс назначения списка вне диапазона».Я мог бы повторить цикл дважды, впервые подсчитав столбцы и строки, затем инициализировать сетку, затем повторить цикл и присвоить значения, но это выглядит ужасно расточительно.

Я довольно новичок в Python и понимаю, что естьпростой способ сделать это, что мне не хватает.

Спасибо за помощь.

Ответы [ 4 ]

3 голосов
/ 26 октября 2011

Вот EAFP контрапункт к @ retracile LBYL подходу.

data = [] #list()
maReader = csv.reader(open('TEST.csv', 'rb'), delimiter=',', quotechar='"')
for rindex, row in enumerate(maReader):
    for iindex, item in enumerate(row):
        try:
            data[iindex].append(item)
        except IndexError:
            data.append([item])
2 голосов
/ 26 октября 2011

Это должно сделать:

maReader = csv.reader(open('TEST.csv', 'rb'), delimiter=',', quotechar='"')
data = zip(*maReader)

Хотя, zip дает список кортежей.Если вам нужен список списков, вы можете сделать любой из этих:

data = [list(x) for x in zip(*maReader)]
data = map(list, zip(*maReader))
2 голосов
/ 26 октября 2011

Предполагая, что все строки одинаковой длины, вы можете подойти к этому следующим образом:

data = list()
maReader = csv.reader(open('TEST.csv', 'rb'), delimiter=',', quotechar='"')
for rindex, row in enumerate(maReader):
    for iindex, item in enumerate(row):
        if len(data) <= iindex:
            data.append([])
        data[iindex].append(item)
1 голос
/ 26 октября 2011

если все строки одинаковой длины, то data = zip(*maReader) должен это сделать. Если нет:

from itertools import izip_longest

list(izip_longest(*f, fillvalue=''))

См. Также Матрица транспонирования в Python .

...