Списки Python

В Python есть отличный встроенный тип списка под названием «список». Литералы списка записываются в квадратных скобках [ ]. Списки работают аналогично строкам: для доступа к данным используйте функцию len() и квадратные скобки [ ] с индексом 0 для первого элемента. (См. официальную документацию списка python.org .)

  colors = ['red', 'blue', 'green']
  print(colors[0])    ## red
  print(colors[2])    ## green
  print(len(colors))  ## 3

список строк «красный» «синий» «зеленый»

Присваивание с = в списках не создает копию. Вместо этого присваивание заставляет две переменные указывать на один список в памяти.

  b = colors   ## Does not copy the list

оба цвета и b указывают на один список

«Пустой список» — это просто пустая пара скобок []. «+» используется для добавления двух списков, поэтому [1, 2] + [3, 4] дает [1, 2, 3, 4] (это похоже на + со строками).

ДЛЯ и В

Конструкции Python *for* и *in* чрезвычайно полезны, и первое их использование, которое мы увидим, связано со списками. Конструкция *for* — for var in list — это простой способ просмотреть каждый элемент в списке (или другой коллекции). Не добавляйте и не удаляйте из списка во время итерации.

  squares = [1, 4, 9, 16]
  sum = 0
  for num in squares:
    sum += num
  print(sum)  ## 30

Если вы знаете, что именно находится в списке, используйте в цикле имя переменной, которая фиксирует эту информацию, например «номер», «имя» или «url». Поскольку в коде Python нет другого синтаксиса, напоминающего вам о типах, имена переменных — это ключевой способ понять, что происходит. (Это немного вводит в заблуждение. По мере того, как вы больше знакомитесь с Python, вы будете видеть ссылки на подсказки типов , которые позволяют вам добавлять информацию о вводе в определения ваших функций. Python не использует эти подсказки типов при запуске ваших программ. Они используются другими программами, такими как IDE (интегрированные среды разработки) и инструментами статического анализа, такими как линтеры/проверщики типов, для проверки того, вызываются ли ваши функции с совместимыми аргументами.)

Конструкция *in* сама по себе — это простой способ проверить, появляется ли элемент в списке (или другой коллекции) — value in collection — проверяет, находится ли значение в коллекции, возвращая True/False.

  list = ['larry', 'curly', 'moe']
  if 'curly' in list:
    print('yay') ## yay

Конструкции for/in очень часто используются в коде Python и работают с типами данных, отличными от списка, поэтому вам следует просто запомнить их синтаксис. У вас могут быть привычки из других языков, когда вы начинаете вручную перебирать коллекцию, тогда как в Python вам следует просто использовать for/in.

Вы также можете использовать for/in для работы со строкой. Строка действует как список своих символов, поэтому for ch in s: print(ch) печатает все символы строки.

Диапазон

Функция range(n) возвращает числа 0, 1,... n-1, а range(a, b) возвращает a, a+1,... b-1 - до последнего числа, но не включая его. . Комбинация цикла for и функции range() позволяет построить традиционный числовой цикл for:

  ## print the numbers from 0 through 99
  for i in range(100):
    print(i)

Существует вариант xrange(), который позволяет избежать затрат на построение всего списка для случаев, чувствительных к производительности (в Python 3 range() будет иметь хорошее поведение по производительности, и вы можете забыть о xrange()).

Пока цикл

В Python также имеется стандартный цикл while, а операторы *break* и *continue* работают так же, как в C++ и Java, изменяя ход самого внутреннего цикла. Вышеупомянутые циклы for/in решают распространенный случай перебора каждого элемента в списке, но цикл while дает вам полный контроль над номерами индексов. Вот цикл while, который обращается к каждому третьему элементу списка:

  ## Access every 3rd element in a list
  i = 0
  while i < len(a):
    print(a[i])
    i = i + 3

Получение списка методов

Вот некоторые другие распространенные методы списков.

  • list.append(elem) — добавляет один элемент в конец списка. Распространенная ошибка: не возвращает новый список, а просто изменяет исходный.
  • list.insert(index, elem) — вставляет элемент по заданному индексу, сдвигая элементы вправо.
  • list.extend(list2) добавляет элементы из списка list2 в конец списка. Использование + или += в списке аналогично использованию метода Extend().
  • list.index(elem) — ищет заданный элемент с начала списка и возвращает его индекс. Выдает ValueError, если элемент не отображается (используйте «in», чтобы проверить без ValueError).
  • list.remove(elem) — ищет первый экземпляр данного элемента и удаляет его (выдает ValueError, если он отсутствует)
  • list.sort() — сортирует список на месте (не возвращает его). (Предпочтительнее использовать функцию sorted(), показанную ниже.)
  • list.reverse() — переворачивает список на место (не возвращает его)
  • list.pop(index) — удаляет и возвращает элемент по заданному индексу. Возвращает самый правый элемент, если индекс опущен (примерно противоположно методу add()).

Обратите внимание, что это *методы* объекта списка, а len() — это функция, которая принимает список (или строку, или что-то еще) в качестве аргумента.

  list = ['larry', 'curly', 'moe']
  list.append('shemp')         ## append elem at end
  list.insert(0, 'xxx')        ## insert elem at index 0
  list.extend(['yyy', 'zzz'])  ## add list of elems at end
  print(list)  ## ['xxx', 'larry', 'curly', 'moe', 'shemp', 'yyy', 'zzz']
  print(list.index('curly'))    ## 2

  list.remove('curly')         ## search and remove that element
  list.pop(1)                  ## removes and returns 'larry'
  print(list)  ## ['xxx', 'moe', 'shemp', 'yyy', 'zzz']

Распространенная ошибка: обратите внимание, что приведенные выше методы не *возвращают* измененный список, они просто изменяют исходный список.

  list = [1, 2, 3]
  print(list.append(4))   ## NO, does not work, append() returns None
  ## Correct pattern:
  list.append(4)
  print(list)  ## [1, 2, 3, 4]

Создание списка

Один из распространенных шаблонов — начать список как пустой список [], а затем использовать метод add() или Extend() для добавления в него элементов:

  list = []          ## Start as the empty list
  list.append('a')   ## Use append() to add elements
  list.append('b')

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

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

  list = ['a', 'b', 'c', 'd']
  print(list[1:-1])   ## ['b', 'c']
  list[0:2] = 'z'    ## replace ['a', 'b'] with ['z']
  print(list)         ## ['z', 'c', 'd']

Упражнение: list1.py

Чтобы попрактиковаться в материале этого раздела, попробуйте решить задачи в list1.py , в которых не используется сортировка (в разделе «Основные упражнения» ).