Д. П. Кириенко. Программирование на языке Python (школа 179 г. Москвы)
Пусть даны два числа: количество строк n и количество столбцов m . Необходимо создать список размером n × m , заполненный нулями.
Очевидное решение оказывается неверным:
A = [ [0] * m ] * n
В этом легко убедиться, если присвоить элементу A[0][0] значение 1 , а потом вывести значение другого элемента A[1][0] — оно тоже будет равно 1! Дело в том, что [0] * m возвращает ccылку на список из m нулей. Но последующее повторение этого элемента создает список из n элементов, которые являются ссылкой на один и тот же список (точно так же, как выполнение операции B = A для списков не создает новый список), поэтому все строки результирующего списка на самом деле являются одной и той же строкой.
Таким образом, двумерный список нельзя создавать при помощи операции повторения одной строки. Что же делать?
Первый способ: сначала создадим список из n элементов (для начала просто из n нулей). Затем сделаем каждый элемент списка ссылкой на другой одномерный список из m элементов:
A = [0] * n for i in range(n): A[i] = [0] * m
Другой (но похожий) способ: создать пустой список, потом n раз добавить в него новый элемент, являющийся списком-строкой:
A = [] for i in range(n): A.append([0] * m)
Но еще проще воспользоваться генератором: создать список из n элементов, каждый из которых будет списком, состоящих из m нулей:
A = [ [0] * m for i in range(n)]
В этом случае каждый элемент создается независимо от остальных (заново конструируется список [0] * m для заполнения очередного элемента списка), а не копируются ссылки на один и тот же список.
Вложенные списки, многомерные списки
Это заключительное занятие по спискам языка Python. Сегодня мы с вами узнаем, как формировать вложенные списки и работать с ними. Но сначала, что это такое и зачем они нужны.
Давайте представим, что нам в программе нужно хранить изображение. Для примера я нарисовал его небольшим, всего 5 на 5 пикселей. Каждый цвет представляется своим уникальным числом. Я, условно, обозначил их 1, 7, 6, 11 и 3. Значит, для представления этих данных нам нужен двумерный список 5×5 с соответствующими числовыми значениями. Мы уже знаем, как задавать одномерный список:
line = [1, 7, 6, 11, 3]
Но так он описывает всего лишь одну строку. А нам нужно хранить пять таких строк. Учитывая, что элементом списка может быть другой список, то данное изображение можно задать так:
img = [[1, 7, 6, 11, 3], [1, 7, 6, 11, 3], [1, 7, 6, 11, 3], [1, 7, 6, 11, 3], [1, 7, 6, 11, 3]]

Мы здесь внутри первого списка определили пять вложенных и в результате получили двумерный список. Кстати, его можно было бы сформировать и проще, учитывая, что все вложенные списки одинаковы, на основе списка line, следующим образом:
img = [line[:], line[:], line[:], line[:], line[:]]
В итоге получим такой же список с независимыми строками:
[[1, 7, 6, 11, 3], [1, 7, 6, 11, 3], [1, 7, 6, 11, 3], [1, 7, 6, 11, 3], [1, 7, 6, 11, 3]]
Вот эта последняя запись нам показывает структуру представления многомерных данных на уровне списков. Первый главный список хранит ссылки на вложенные списки. А вложенные списки уже хранят ссылки на соответствующие числа, представляющие тот или иной цвет. Поэтому, если взять первый элемент главного списка:
img[0]
то мы получим список, представляющий первую строку (или, первый столбец в зависимости от интерпретации программистом этих данных). Главное, что мы получаем доступ к первому вложенному списку. А раз это так, то можно записать еще одни квадратные скобки и из этого вложенного списка взять, допустим, второй элемент:
img[0][1]
Также, можно заменить, например, вторую строку на новую, допустим, такую:
img[1] = [0, 0, 0, 0, 0]
или, то же самое, в более краткой форме:
img[1] = [0] * 5
Что в итоге здесь произошло? Мы сформировали новый объект – список из нулей, связали с ним вторую ссылку главного списка, а прежний список был автоматически удален сборщиком мусора.

Если бы мы хотели изменить значения уже существующего вложенного списка, то следовало бы обратиться к его элементам, например, через механизм срезов:
img[1][:] = [0] * 5
и присвоить его элементам новые числовые значения. Вот так это работает в деталях.
В качестве второго примера мы представим вложенными списками строки известного стихотворения на уровне отдельных слов:
Люблю тебя, Петра творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит,
Здесь в каждой строке разное число слов, но для вложенных списков – это не проблема. Они могут иметь разное число элементов:
t = [["Люблю", "тебя", "Петра", "творенье"], ["Люблю", "твой", "строгий", "стройный", "вид"], ["Невы", "державное", "теченье"], ["Береговой", "ее", "гранит"] ]

В результате получаем следующую структуру наших данных. Здесь также для доступа к первой строке достаточно указать первый индекс:
а к отдельному слову этой строки, второй индекс:
Если же мы хотим изменить какое-либо слово, то это делается, следующим образом:
t[0][2] = "Питон"
В итоге, первая строка принимает вид:
[‘Люблю’, ‘тебя’, ‘Питон’, ‘творенье’]
Мало того, мы можем добавить новую строку, используя известный метод:
t.append(["Твоих", "оград", "узор", "чугунный"])
del t[1]
И так далее, то есть, делать с вложенными списками все те же операции, что и с обычными данными.
В заключение покажу пример многомерного списка с разными уровнями глубины:
A = [[[True, False], [1, 2, 3]], ["матрица", "вектор"]]
это двумерный список, а
одномерный вложенный список. Соответственно, для третьего уровня вложенности можем использовать три индекса для доступа к отдельному элементу, например:
A[0][1][0]
Здесь мы берем первый элемент, затем второй вложенный список и из него выбираем первый элемент.
Вот так в Python можно определять многомерные списки разной структуры и разного уровня вложенности.
Для закрепления этого материала подготовлены практические задания, после которых жду вас на следующем уроке.
Видео по теме

#1. Первое знакомство с Python Установка на компьютер

#2. Варианты исполнения команд. Переходим в PyCharm

#3. Переменные, оператор присваивания, функции type и id

#4. Числовые типы, арифметические операции

#5. Математические функции и работа с модулем math

#6. Функции print() и input(). Преобразование строк в числа int() и float()

#7. Логический тип bool. Операторы сравнения и операторы and, or, not

#8. Введение в строки. Базовые операции над строками

#9. Знакомство с индексами и срезами строк

#10. Основные методы строк

#11. Спецсимволы, экранирование символов, row-строки

#12. Форматирование строк: метод format и F-строки

#13. Списки — операторы и функции работы с ними

#14. Срезы списков и сравнение списков

#15. Основные методы списков

#16. Вложенные списки, многомерные списки

#17. Условный оператор if. Конструкция if-else

#18. Вложенные условия и множественный выбор. Конструкция if-elif-else

#19. Тернарный условный оператор. Вложенное тернарное условие

#20. Оператор цикла while

#21. Операторы циклов break, continue и else

#22. Оператор цикла for. Функция range()

#23. Примеры работы оператора цикла for. Функция enumerate()

#24. Итератор и итерируемые объекты. Функции iter() и next()

#25. Вложенные циклы. Примеры задач с вложенными циклами

#26. Треугольник Паскаля как пример работы вложенных циклов

#27. Генераторы списков (List comprehensions)

#28. Вложенные генераторы списков

#29. Введение в словари (dict). Базовые операции над словарями

#30. Методы словаря, перебор элементов словаря в цикле

#31. Кортежи (tuple) и их методы

#32. Множества (set) и их методы

#33. Операции над множествами, сравнение множеств

#34. Генераторы множеств и генераторы словарей

#35. Функции: первое знакомство, определение def и их вызов

#36. Оператор return в функциях. Функциональное программирование

#37. Алгоритм Евклида для нахождения НОД

#38. Именованные аргументы. Фактические и формальные параметры

#39. Функции с произвольным числом параметров *args и **kwargs

#40. Операторы * и ** для упаковки и распаковки коллекций

#41. Рекурсивные функции

#42. Анонимные (lambda) функции

#43. Области видимости переменных. Ключевые слова global и nonlocal

#44. Замыкания в Python

#45. Введение в декораторы функций

#46. Декораторы с параметрами. Сохранение свойств декорируемых функций

#47. Импорт стандартных модулей. Команды import и from

#48. Импорт собственных модулей

#49. Установка сторонних модулей (pip install). Пакетная установка

#50. Пакеты (package) в Python. Вложенные пакеты

#51. Функция open. Чтение данных из файла

#52. Исключение FileNotFoundError и менеджер контекста (with) для файлов

#53. Запись данных в файл в текстовом и бинарном режимах

#54. Выражения генераторы

#55. Функция-генератор. Оператор yield

#56. Функция map. Примеры ее использования

#57. Функция filter для отбора значений итерируемых объектов

#58. Функция zip. Примеры использования

#59. Сортировка с помощью метода sort и функции sorted

#60. Аргумент key для сортировки коллекций по ключу

#61. Функции isinstance и type для проверки типов данных

#62. Функции all и any. Примеры их использования

#63. Расширенное представление чисел. Системы счисления

#64. Битовые операции И, ИЛИ, НЕ, XOR. Сдвиговые операторы

#65. Модуль random стандартной библиотеки

#66. Аннотация базовыми типами

#67. Аннотации типов коллекций

#68. Аннотации типов на уровне классов

#69. Конструкция match/case. Первое знакомство

#70. Конструкция match/case с кортежами и списками

#71. Конструкция match/case со словарями и множествами

#72. Конструкция match/case. Примеры и особенности использования
© 2023 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта
Python списки
Списком в языке Python называется упорядоченная структура данных, которая используется для хранения объектов произвольных типов. В отличие от массивов, включающих в себя лишь однотипные элементы, списки не привязаны к определенной разновидности данных, а также не имеют жестких ограничений, связанных с их размером. Благодаря всем этим особенностям, списки являются достаточно гибким инструментом по работе с данными в Python.
Создание и заполнение
Перед тем как использовать список, необходимо его инициализировать. Как правило, сделать это можно несколькими способами. В данном примере показано, что будет, если определить пустой список с именем data, а затем вывести его содержимое на экран.
>>> data = [] >>> data []
Поместить все необходимые элементы в новый список можно прямо в момент его создания, просто перечислив их в квадратных скобках.
>>> data = [5, 'a', ['python'], 20] >>> data [5, 'a', ['python'], 20]
Для заполнения списков можно использовать разные литералы, к примеру, строки, вызывая встроенную функцию list, как это показано в следующем примере.
>>> data = list('python') >>> data ['p', 'y', 't', 'h', 'o', 'n']
Чтобы автоматизировать заполнение совокупностей разнотипных объектов, рекомендуется использовать генераторы списков. Данные механизмы позволяют применять определенное выражение к каждому элементу заданной последовательности.
Добавление элемента
При занесении новых данных в список его размер автоматически увеличивается на нужное количество ячеек. Для того чтобы в Python добавить в список элемент стоит воспользоваться методом append, передав ему в качестве аргумента добавляемый объект. В результате выполнения этой функции, элемент будет добавлен в конец.
>>> data = list('pytho') >>> data.append('n') >>> data ['p', 'y', 't', 'h', 'o', 'n']
При необходимости любой из объектов можно размещать по заданному индексу в списке. Для этого используется метод с именем insert. Вызвав его для существующего списка, нужно передать в качестве аргументов желаемый номер элемента и сам объект.
>>> data = list('ython') >>> data.insert(0, 'p') >>> data ['p', 'y', 't', 'h', 'o', 'n']
Стоит принять во внимание, что нумерация объектов в списке осуществляется с нуля.
Расширение списка
Имея необходимость объединить два разных набора данных, представленных в виде списков, стоит воспользоваться методом extend. Выполнив его вызов для одного из объектов и записав в качестве аргумента другой объект, произойдет их слияние в одно целое.
>>> data1 = list('pyt') >>> data2 = list('hon') >>> data1.extend(data2) >>> data1 ['p', 'y', 't', 'h', 'o', 'n']
Таким образом, элементы второго списка будут автоматически записаны в конец первого.
Удаление элемента
Встроенные функции платформы позволяют не только добавлять новые данные, но и выборочно избавляться от них. Для того, чтобы удалить элемент из списка Python существуют функции remove и pop. В случае с первым методом происходит удаление первого по индексу объекта с выбранным значением.
>>> data = list('pytthon') >>> data.remove('t') >>> data ['p', 'y', 't', 'h', 'o', 'n']
Метод pop действует несколько иначе, давая возможность извлечь элемент списка по любому индексу, как это показано в следующем примере.
>>> data = list('pytthonn') >>> data.pop(3) 't' >>> data.pop() 'n' >>> data ['p', 'y', 't', 'h', 'o', 'n']
Если же не передавать номер необходимого объекта, то удалится последний по счету.
Очистка списка
Быстро удалить все элементы списка поможет функция clear. Для этого потребуется вызвать ее через созданный ранее объект, как в следующем примере.
>>> data = list('python') >>> data.clear() >>> data []
Стоит отметить, что сам список после осуществления данной операции не удаляется.
Получение размера
Воспользовавшись встроенным методом с именем len, можно определить количество элементов в списке Python — его длину. Функция возвращает общее количество элементов.
>>> data = list('python') >>> len(data) 6
Также существует возможность узнать количество выбранных объектов при помощи метода count. Его необходимо вызвать для текущего списка. В качестве аргументов здесь должен выступать искомый элемент.
>>> data = list('python') >>> data.count('p') 1
Благодаря этой функции можно искать не только литералы, но и ссылки на объекты.
Сортировка
Сортировка списка Python осуществляется с помощью sort. Функция sort производит упорядочивание присутствующих в выбранном списке элементов, автоматически определяя наиболее подходящий способ сортировки.
>>> data = list('python') >>> data.sort() >>> data ['h', 'n', 'o', 'p', 't', 'y']
Например, при помощи данного метода можно быстро изменить текущее расположение чисел, символов или строк, отсортировав их по возрастанию либо в алфавитном порядке.
Переворачивание
Как показывает практика, иногда возникает необходимость в представлении элементов списка в обратном порядке, к примеру, после обычной сортировки. Выполнить такую задачу поможет метод под названием reverse, который следует вызвать для списка.
>>> data = list('python') >>> data.reverse() >>> data ['n', 'o', 'h', 't', 'y', 'p']
Как можно увидеть, данная функция просто меняет порядок элементов на противоположный.
Копирование
Чтобы получить два одинаковых списка привычной операции присваивания недостаточно, поскольку в таком случае объект не копируется, а лишь создается еще одна ссылка на него. Получить полноценный дубликат выбранного списка поможет функция copy.
>>> data1 = list('python') >>> data2 = data1.copy() >>> data2 ['p', 'y', 't', 'h', 'o', 'n']
После вызова данного метода на любом существующем списке происходит автоматическое создание аналогичного по внутреннему содержанию объекта, который в последствие можно свободно присвоить другой ссылке.
Поиск
Чтобы осуществить в Python поиск в списке и найти индекс известного элемента следует прибегнуть к функции index. Аргументом данного метода является искомый объект либо литерал.
>>> data = list('python') >>> data.index('o') 4
Как можно увидеть из результатов этого действия, на экране отображается индекс элемента.
Преобразование списка в строку
Состоящий из символов список поддается конвертации в строчное представление. Для этого потребуется выполнить конкатенацию новой строки с возвращаемым значением функции join. В качестве аргумента для данного метода должен выступать список. Вот пример преобразования в строку списка Python.
>>> data = list('python') >>> str = ''.join(data) >>> str 'python'
Созданная подобным способом строка получает значение всех элементов списка.
Получение двумерного списка
Базовые возможности платформы позволяют работать с двумерным представлением набора определенных значений в программе. Реализовать это можно при помощи обычного оператора присваивания, просто добавляя список в список Python для получения двумерного списка.
>>> data = [[1, 2, 8], [2, 5, 6]] >>> a[0] [1, 2, 8] >>> a[1] [2, 5, 6]
Таким образом, можно увидеть, что двумерный список строится на нескольких одномерных.
Преобразование словаря в список
Как известно, словарь может хранить заданную коллекцию произвольных объектов, доступ к которым осуществляется по ключу. Воспользовавшись методом items, можно преобразовать словарь в список, как это показано в следующем примере.
>>> dic = <> >>> dic['name'] = 'John' >>> dic['age'] = 25 >>> data = dic.items() >>> data dict_items([('name', 'John'), ('age', 25)])
Элементы в инициализированном таким образом списке представлены в виде пар с ключом и соответствующим ему значением.
Заключение
Стандартная библиотека языка Python содержит множество полезных функций по работе со списками, что позволяет программисту эффективно манипулировать упорядоченным набором данных различных типов. Методы и операции со списками Python 3 предоставляют возможность не только автоматически менять внутреннее содержимое любого списка, но и конвертировать его в другие формы представления информации.
python: как записать значение в двумерный массив?
В Python для того, чтобы изменять значение элемента списка по индексу нужно каким-то образом сначала добавить этот элемент в список.
А так будет работать:
for i, snt in enumerate(text_list): matrix.append([]) # append new sublist to the list for j, wrd in enumerate(dict): matrix[i].append(snt.count(wrd)) # append the value to the sublist
На каждой итерации внешнего цикла мы создаем пустой подсписок и добавляем его в список. Внутренний цикл добавляет элемент в подсписок.
После добавления элементов к ним можно обращаться по индексам.
А функции print все равно какие индексы выводить.
Отслеживать
ответ дан 9 ноя 2016 в 17:21
Aleksandr Balyunou Aleksandr Balyunou
176 5 5 бронзовых знаков
круто! спасибо!
9 ноя 2016 в 18:43
Чтобы создать матрицу подсчёта повторений слов в предложениях, заданного текста (как список предложений, заданных как список слов):
matrix = [[sentence.count(word) for word in dict_] for sentence in text]
В вашем случае ошибка из-за того, что вы вероятно ожидали, что matrix[i][j] = value конструкция создаёт новый (i, j) элемент в матрице. В Питоне списки не создают новые элементы с помощью присваивания простым индексам. Поэтому если matrix[i][j] не существовал, то присваивание выбросит IndexError ошибку.
Отслеживать
ответ дан 9 ноя 2016 в 19:29
52.2k 11 11 золотых знаков 108 108 серебряных знаков 312 312 бронзовых знаков
и вам спасибо! перестраиваюсь с пхп на питон, а мануала толкового пока не нашел в инете. еще вопрос, а метод count получается же ищет не вхождение слова в предложение, а вхождение подстроки в строку. Что не есть одно и тоже. Если мне нужна именно частота слова в предложении, то как быть, есть ли стандартные функции?
9 ноя 2016 в 20:50
@VladimirVasilev Материалов о Питоне навалом—это один из самых популярных языков. Для людей знакомых с программированием, можно начать с официального вводного руководства (доступно и в виде книги на русском и online)¶ Я явно написал в ответе, что sentence это список (а не строка) как раз потому что иначе подстроки ищутся в count(). Если не знаете как разбить предложение на отдельные слова, то задайте отдельный Stack Overflow вопрос: в зависимости от ваших конкретных требований, решение может использовать и простой words = sentence.split() вызов, и regex, и TweetTokenizer из nltk, итд.
