Примеры работы со списками Python
Список Python — это последовательность значений любого типа: строки, числа, числа с плавающей точкой или даже смешанного типа. В этом материале речь пойдет о функциях списков, о том, как создавать их, добавлять элементы, представлять в обратном порядке и многих других.
Создать списки Python
Для создания списка Python нужно заключить элементы в квадратные скобки:
my_list = [1, 2, 3, 4, 5]
Список может выглядеть так:
my_list = ['один', 'два', 'три', 'четыре', 'пять']
Можно смешивать типы содержимого:
my_list = ['один', 10, 2.25, [5, 15], 'пять']
Поддерживаются вложенные списки как в примере выше.
Получать доступ к любому элементу списка можно через его индекс. В Python используется система индексации, начиная с нуля.
third_elem = my_list[2]
Принцип похож на строки.
Изменение списка
Списки — это изменяемые объекты, поэтому их элементы могут изменяться, или же может меняться их порядок.
Если есть такой список:
my_list = ['один', 'два', 'три', 'четыре', 'пять']
То его третий элемент можно изменить следующим образом:
my_list[2] = 'ноль'
Если сейчас вывести его на экран, то он будет выглядеть вот так:
['один', 'два', 'ноль', 'четыре', 'пять']
Если индекс — отрицательное число, то он будет считаться с последнего элемента.
my_list = ['один', 'два', 'три', 'четыре', 'пять'] elem = my_list[-1] print(elem)
Вывод этого кода — ‘пять’.
Проход (итерация) по списку
Читать элементы списка можно с помощью следующего цикла:
my_list = ['один', 'два', 'три', 'четыре', 'пять'] for elem in my_list: print(elem)
Таким образом можно читать элементы списка. А вот что касается их обновления:
my_list = [1, 2, 3, 4, 5] for i in range(len(my_list)): my_list[i]+=5 print(my_list)
Результат будет следующим:
[6, 7, 8, 9, 10]
Функция len() используется для возврата количества элементов, а range() — списка индексов.
Стоит запомнить, что вложенный список — это всегда один элемент вне зависимости от количества его элементов.
my_list = ['один', 10, 2.25, [5, 15], 'пять'] print(len(my_list))
Результат кода выше — 5 .
Срез списка
Можно получить срез списка с помощью оператора ( : ):
my_list = ['один', 'два', 'три', 'четыре', 'пять'] print(my_list[1:3])
Результат кода выше — [‘два’, ‘три’]
Если убрать первое число, от срез будет начинаться с первого элемента, а если второе — с последнего.
Если убрать числа и оставить только двоеточие, то скопируется весь список.
my_list = ['один', 'два', 'три', 'четыре', 'пять'] print(my_list[1:3]) print(my_list[1:]) print(my_list[:3]) print(my_list[:])
Результат этого года:
['два', 'три'] ['два', 'три', 'четыре', 'пять'] ['один', 'два', 'три'] ['один', 'два', 'три', 'четыре', 'пять']
Поскольку списки изменяемые, менять элементы можно с помощью оператора среза:
my_list = ['один', 'два', 'три', 'четыре', 'пять'] my_list[1:3] = ['Привет', 'Мир'] print(my_list)
['один', 'Привет', 'Мир', 'четыре', 'пять']
Вставить в список
Метод insert можно использовать, чтобы вставить элемент в список:
my_list = [1, 2, 3, 4, 5] my_list.insert(1,'Привет') print(my_list)
[1, 'Привет', 2, 3, 4, 5]
Индексы для вставляемых элементов также начинаются с нуля.
Добавить в список
Метод append можно использовать для добавления элемента в список:
my_list = ['один', 'два', 'три', 'четыре', 'пять'] my_list.append('ещё один') print(my_list)
['один', 'два', 'три', 'четыре', 'пять', 'ещё один']
Можно добавить и больше одного элемента таким способом:
my_list = ['один', 'два', 'три', 'четыре', 'пять'] list_2 = ['шесть', 'семь'] my_list.extend(list_2) print(my_list)
['один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь']
При этом list_2 не поменяется.
Отсортировать список
Для сортировки списка нужно использовать метод sort .
my_list = ['cde', 'fgh', 'abc', 'klm', 'opq'] list_2 = [3, 5, 2, 4, 1] my_list.sort() list_2.sort() print(my_list) print(list_2)
['abc', 'cde', 'fgh', 'klm', 'opq'] [1, 2, 3, 4, 5]
Перевернуть список
Можно развернуть порядок элементов в списке с помощью метода reverse :
my_list = [1, 2, 3, 4, 5] my_list.reverse() print(my_list)
[5, 4, 3, 2, 1]
Индекс элемента
Метод index можно использовать для получения индекса элемента:
my_list = ['один', 'два', 'три', 'четыре', 'пять'] print(my_list.index('два'))
Если в списке больше одного такого же элемента, функция вернет индекс первого.
Удалить элемент
Удалить элемент можно, написав его индекс в методе pop :
my_list = ['один', 'два', 'три', 'четыре', 'пять'] removed = my_list.pop(2) print(my_list) print(removed)
['один', 'два', 'четыре', 'пять'] три
Если не указывать индекс, то функция удалит последний элемент.
my_list = ['один', 'два', 'три', 'четыре', 'пять'] removed = my_list.pop() print(my_list) print(removed)
['один', 'два', 'три', 'четыре'] пять
Элемент можно удалить с помощью метода remove .
my_list = ['один', 'два', 'три', 'четыре', 'пять'] my_list.remove('два') print(my_list)
['один', 'три', 'четыре', 'пять']
Оператор del можно использовать для тех же целей:
my_list = ['один', 'два', 'три', 'четыре', 'пять'] del my_list[2] print(my_list)
['один', 'два', 'четыре', 'пять']
Можно удалить несколько элементов с помощью оператора среза:
my_list = ['один', 'два', 'три', 'четыре', 'пять'] del my_list[1:3] print(my_list)
['один', 'четыре', 'пять']
Функции агрегации
В Python есть некоторые агрегатные функции:
my_list = [5, 3, 2, 4, 1] print(len(my_list)) print(min(my_list)) print(max(my_list)) print(sum(my_list))
sum() работает только с числовыми значениями.
А max() , len() и другие можно использовать и со строками.
Сравнить списки
В Python 2 сравнить элементы двух списком можно с помощью функции cmp :
my_list = ['один', 'два', 'три', 'четыре', 'пять'] list_2 = ['три', 'один', 'пять', 'два', 'четыре'] print(cmp(my_list,list_2))
Она вернет -1 , если списки не совпадают, и 1 в противном случае.
В Python 3 для этого используется оператор ( == ):
my_list = ['один', 'два', 'три', 'четыре', 'пять'] list_2 = ['три', 'один', 'пять', 'два', 'четыре'] if (my_list == list_2): print('cовпадают') else: print('не совпадают')
Результат не совпадают .
Математические операции на списках:
Для объединения списков можно использовать оператор ( + ):
list_1 = [1, 2, 3] list_2 = [4, 5, 6] print(list_1 + list_2)
[1, 2, 3, 4, 5, 6]
Список можно повторить с помощью оператора умножения:
list_1 = [1, 2, 3] print(list_1 * 2)
[1, 2, 3, 1, 2, 3]
Списки и строки
Для конвертации строки в набор символов, можно использовать функцию list :
my_str = 'Monty Python' my_list = list(my_str) print(my_list)
['M', 'o', 'n', 't', 'y', ' ', 'P', 'y', 't', 'h', 'o', 'n']
Функция list используется для того, чтобы разбивать строку на отдельные символы.
Можно использовать метод split для разбития строки на слова:
my_str = 'Monty Python' my_list = my_str.split() print(my_list)
['Monty', 'Python']
Она возвращает обычный список, где с каждым словом можно взаимодействовать через индекс.
Символом разбития может служить любой знак, а не только пробел.
my_str = 'Monty-Python' my_list = my_str.split('-') print(my_list)
Результат будет аналогичен:
['Monty', 'Python']
Объединить список в строку
Обратный процесс — объединение элементов списка в строку.
Это делается с помощью метода join :
my_list = ['Monty', 'Python'] delimiter = ' ' output = delimiter.join(my_list) print(output)
Результат Monty Python .
Алиасинг (псевдонимы)
Когда две переменные ссылаются на один и тот же объект:
my_list = ['Monty', 'Python'] list_2 = my_list
Алиасинг значит, что на объект ссылается больше одного имени.
Следующий пример показывает, как меняются изменяемые списки:
my_list = ['Monty', 'Python'] list_2 = my_list list_2[1] = 'Java:)' print(my_list)
['Monty', 'Java:)']
Изменился список list_2 , но поскольку он ссылается на один и тот же объект, то оригинальный список тоже поменялся.
Использовать “псевдонимы” при работе со списками не рекомендуется.
В целом, работать со списками в Python очень просто.
Как получить сумму всех чисел в списке?
Как получить сумму чисел в списке? Список состоит из чисел в виде str , с плавающей точкой. Конвертировал список из str в int , тогда можно применить sum() , но все числа округляются, это не подходит, падает точность расчетов. Что было сделано?
some_list = ['0.11', '0.09', '1.0', '0.5', '0.33', '0.25', '0.2', '0.2', '0.16', '0.14', '0.07', '0.03', '0.01', '1.81'] res = [int(itm) for itm in some_list] res2 = list(map(int, some_list))
Как преобразовать список в числа и получить их сумму, как одну запись в списке? Пример:
some_list = [24.25]
Отслеживать
47.8k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 1 мар 2022 в 16:18
115 12 12 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Нужно конвертировать не в int, а в float, хотя операции с плавающей точкой могут быть не очень точными и это надо иметь ввиду.
math.fsum(list(map(float, some_list)))
Для более точных расчетов можно поискать библиотеки, к примеру какой-нибудь bigfloat https://pypi.org/project/bigfloat/.
Отслеживать
ответ дан 1 мар 2022 в 17:08
Alex Krass Alex Krass
17.5k 2 2 золотых знака 24 24 серебряных знака 52 52 бронзовых знака
можно использовать Decimal
3 мар 2022 в 11:22
@Danis, можно, если автор вопроса решит принять другой ответ вместо моего, я не против.
3 мар 2022 в 11:24
Здесь, конечно, напрашиваеся использование стандартной библиотеки decimal . В ней десятичные числа могут быть представлены точно, как в школе. И эти числа хорошо взаимодействуют с большей частью Python. Поэтому код получается таким:
import decimal as d some_list = ['0.11', '0.09', '1.0', '0.5', '0.33', '0.25', '0.2', '0.2', '0.16', '0.14', '0.07', '0.03', '0.01', '1.81'] print(sum(list(map(d.Decimal, some_list))))
Сначала преобразуем список строк в список десятичных «цифр» и затем суммируем. Получаем точный результат.
Как перемножить числа в списке?
пользователь вводит любые числа в строку которые добавляются в список сумму можно найти sum(spisok) а как найти произведение? можно вроде циклом через for а если например в одну строку как реализовать?
Отслеживать
user536011
задан 3 дек 2020 в 9:28
823 1 1 золотой знак 9 9 серебряных знаков 29 29 бронзовых знаков
9 ответов 9
Сортировка: Сброс на вариант по умолчанию
Раньше можно было использвать reduce(). Сейчас тоже можно, но эту функцию вынесли в отдельный модуль, так что строго говоря, считая импорт, получается две строчки:
import functools print (functools.reduce(lambda a, b : a * b, lst))
Отслеживать
Я бы добавил ещё и третью строчку, с импортом оператора умножения =) Upd: А, это есть ниже)
3 дек 2020 в 11:30
а почему сделали общим?
3 дек 2020 в 14:12
@Danis Я сам сделал, потому что код не мой и есть на многих страницах в интернете как иллюстрация к reduce()
3 дек 2020 в 14:33
Все ответы здесь отстали от современности. Как насчет python-3.8 и выше?
math.prod
import math math.prod([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Это пожалуй самое простое и стандартное решение ИМХО.
Отслеживать
5,406 1 1 золотой знак 15 15 серебряных знаков 33 33 бронзовых знака
ответ дан 21 дек 2020 в 11:51
USERNAME GOES HERE USERNAME GOES HERE
10.4k 21 21 золотой знак 25 25 серебряных знаков 53 53 бронзовых знака
from functools import reduce # Функция для свёрки последовательности from operator import mul # Функция, перемножающая 2 числа spisok = [16, 15, 9, 14, 13] # Исходный список result = reduce(mul, spisok) # /\ Список для свёртки # /\ Используем умножение # /\ Сворачиваем контейнер
Отслеживать
ответ дан 3 дек 2020 в 10:16
Mikhail Murugov Mikhail Murugov
5,406 1 1 золотой знак 15 15 серебряных знаков 33 33 бронзовых знака
Можно реализовать функцию mul
def mul(list_): n = 1 for el in list_: n *= el return n
либо так, с помощью lambda и рекурсии
mul = lambda arr:arr[0] * mul(arr[1:]) if arr else 1
Отслеживать
ответ дан 3 дек 2020 в 9:41
19.6k 6 6 золотых знаков 22 22 серебряных знака 56 56 бронзовых знаков
тут пять строк, не считая той, где это будет вызываться. Про for автор даже в вопросе сам написал.
3 дек 2020 в 9:42
С импортом можно и так:
import numpy as np result = np.prod(np.array(mylist))
Отслеживать
ответ дан 3 дек 2020 в 9:51
Serg Bocharov Serg Bocharov
1,694 1 1 золотой знак 6 6 серебряных знаков 11 11 бронзовых знаков
Тяжеленный numpy для таких простейших задач.
3 дек 2020 в 10:17
@МихаилМуругов вопрос-то был «а можно ли сделать в одну строку?» — вот и приводим разные примеры
3 дек 2020 в 10:43
let num = Number(prompt()) let lis = [] let mult = [] while (num) < num = Number(prompt()) lis.append(num) >var m = 1 for (let n = 0; n
Отслеживать
ответ дан 3 дек 2020 в 10:56
Alexander_Sky Alexander_Sky
87 1 1 серебряный знак 8 8 бронзовых знаков
А где тут python?
3 дек 2020 в 10:58
а как это все записать в одну строчку?
3 дек 2020 в 11:01
@Эникейщик это даже не python))
3 дек 2020 в 11:01
)) правда, не обратил внимание, но это в целом не сложно должно быть переделать, если видишь на одном языке
3 дек 2020 в 11:02
@Alexander_Sky Ничего, я тут тоже поначалу путался где какой язык )) А надо на тэги смотреть
3 дек 2020 в 11:17
Я приведу не очень практичное, но красивое решение в одну строку. Оно не использует eval , побочные эффекты при работе со списком или именованные функции.
Если именованные функции разрешены, то решение может выглядеть так:
def p(a): if a: return a[0] * p(a[1:]) return 1 print(p([1, 2, 3, 4, 5]))
Нам оно не подходит, так именованная функция требует минимум две строки для определения и вызова. Лямбду можно определить и вызвать в одной строке, но есть трудность в создании рекурсивной лямбды. Синтаксис Python разрешает такой трюк:
p = (lambda a: a[0] * p(a[1:]) if a else 1); print(p([1, 2, 3, 4, 5]))
Это именно трюк с глобальной переменной и двумя операторами в одной строке. А можно обойтись без глобальной переменной вообще. На первый взгляд этого не может быть так как имя нужно чтобы сделать рекурсивный вызов. Но функцию можно передать как аргумент в саму себя:
p = lambda f, a: a[0] * f(f, a[1:]) if a else 1 print(p(p, [1, 2, 3, 4, 5]))
Кажется мы ничего не выиграли: всё равно два оператора и глобальная переменная p . Однако сделан очень важный шаг — тело лямбды не использует глобальные переменные. Глобальная переменная используется в операторе print . Избавимся от неё:
p = lambda f, a: a[0] * f(f, a[1:]) if a else 1 y = lambda f, a: f(f, a) print(y(p, [1, 2, 3, 4, 5]))
Стало только хуже: три строки и две глобальные переменные. Зато каждая глобальная переменная задействована только один раз. Делаем подстановку:
print((lambda f, a: f(f, a))(lambda f, a: a[0] * f(f, a[1:]) if a else 1, [1, 2, 3, 4, 5]))
Читается тяжело, но задача решена в одну строку без глобальных имён и волшебных вызовов eval .
P.S. Читайте Fixed-point combinator чтобы узнать откуда пошло это решение.
P.P.S. Красивое утверждение: программу любой сложности можно записать в функциональном стиле не определив ни одной глобальной переменной, включая имена функций.
P.P.P.S. Не пытайтесь повторить это дома.
Сложить цифры в списке
Каким образом можно сложить списки ниже, по принципу [2, 0.16]+[2, 0.31]+[2, -0.16]+[2, 0.29] = [2, 0.6] (оставить первое значение и сложить все вторые значения)? Итог который должен получиться примерно такой l = [[2, 12.7452], [7, 4.8432], [-9, 42.2], [-14, 9.5242], [17, -5.323], [-18, -11.6573], . ] (вторые значения суммированы, а первые идут в порядке возрастания, без учета минуса перед цифрой)
l = [2, 0.16796830136672278], [7, 0.02264685067233594], [-9, -1.7999825667547869], [-14, 0.35134392666598474], [17, -0.06198644947382464], [-18, -0.26257380354836923], [21, -0.27785051351430345], [28, 0.23018502771016694], [31, 1.2600080640516098], [-6, 0.13243317163050966], [7, -0.7386231715811474], [-11, 0.9637237133569254], [13, -0.347137898030021], [-14, -0.2017398271619146], [15, 0.604400259835622], [-18, -0.3900453639716941], [19, 0.6060690890767692], [21, -0.6480431083380713], [28, 0.5959078218110626], [2, -0.06984020560956135], [-9, -0.16511430990686485], [-11, -0.06845105051407072], [17, 0.2587769674660778], [-18, -0.1457204916004434], [19, -0.39829655866260766], [24, 0.870501048960589], [31, 1.3188360662396783], [2, 0.31743905705865894], [-6, 0.2606195760230025], [7, 0.03598608538032098], [-9, -0.3484600745168345], [13, -0.1622867429459814], [-14, -0.37338018888645613], [17, 1.0035998690956751], [21, 0.5111933721135139], [28, 0.19697700594951703], [30, 0.8566563796956548], [-6, 0.4978363786811951], [7, -0.4372487173586489], [-11, -0.6578679099101669], [13, -0.09856532690833798], [-14, -0.4048694124590007], [15, 0.5023543583004879], [-18, -0.6191993159847172], [19, 0.3916610551486204], [21, -0.699765820943084], [28, 1.0313085582197], [2, -0.16476534900930645], [-9, 0.14147045228523678], [-11, 0.36624425567470437], [17, -0.17408123791103175], [-18, 0.37165544386082916], [19, 0.45534967288887523], [24, 0.5038299266784088], [31, 1.2100016079755664], [2, 0.29197080291971905], [-6, -0.5568186459368464], [7, -0.6239091896051888], [-9, 0.11767925561028807], [13, 0.07676175071621096], [-14, -0.36602818141788496], [19, -1.1413679692290577], [21, 0.12119876597621208], [23, -0.4750131948109652]
