Чем отличается список от строки в python
Перейти к содержимому

Чем отличается список от строки в python

  • автор:

Вчем разница между двумя способами создания списка

Кажется, что они делают одно и тоже но результат разный, и первая и вторая часть создают список, но по-разному, почему так?

Отслеживать
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака
задан 8 дек 2017 в 13:16
117 1 1 золотой знак 1 1 серебряный знак 11 11 бронзовых знаков
я не совсем понял суть вопроса — можете уточнить?
8 дек 2017 в 13:35
литерал списка [[]], и list([]), по разному создают список, а делают одно и тоже
8 дек 2017 в 13:39

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

По-моему разница в том, что конструктор list() проверяет является ли переданный ему аргумент итерируемым объектом и в том случае если это итерируемый объект — конструктор вернет список объектов возвращенных итератором. «list literal» [] таких проверок не делает — он просто создает список из переданных объектов.

def f(n): for i in range(n): yield i In [23]: list(f(10)) Out[23]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] In [24]: [f(10)] Out[24]: [] 

тоже самое происходит со строками ( string в Python — итерируемый объект)

In [25]: list('abc') Out[25]: ['a', 'b', 'c'] In [26]: ['abc'] Out[26]: ['abc'] 

проверка на итерируемость:

In [27]: import collections In [28]: isinstance('abc', collections.Iterable) Out[28]: True 

Также [] отрабатывает быстрее чем list() , т.к. list() требует поиска в таблице методов:

In [64]: %timeit [] 22.1 ns ± 0.0214 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) In [65]: %timeit list() 126 ns ± 3.6 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) 

Чем отличаются списки от массивов в Python?

Списками и массивами Python

Списками и массивами Python

Чтобы понять, в чем заключается разница между списками и массивами в Python, нужно подумать о цели создания массивов — массивы были созданы для того, чтобы минимизировать ресурсы, затраченные на выполнение операций с элементами одного типа. Списки же можно использовать для объединения элементов как одного типа, так и разных типов. Например, если у Вас есть большое количество финансовых данных типа float, и Вам нужно осуществить расчеты с этими данными, то массивы — это верный выбор. А если необходимо соединить воедино строковые и числовые данные, либо небольшое количество данных одного типа (при этом расход памяти не имеет значения), — то списки будут оптимальным вариантом.

Таким образом, разница между списками и массивами в Python заключается в том, что:

1. В списках могут храниться элементы различных типов данных: например, список одновременно может включать числовые и строковые данные. В то время, как массивы хранят элементы одного и того же типа данных, например, только элементы типа int, либо только элементы типа float, при этом тип элементов указывается при создании массива:

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

# списки могут содержать данные разных типов lst = [1, 1.0, 'слово', (50, 50)] print(lst)

Вывод на экран:

[1, 1.0, 'слово', (50, 50)]

Создание массива:

import array as arr datas = arr.array('f', [1.1, 2.1, 1.089, 24.]) print(datas)

Вывод на экран:

array('f', [1.100000023841858, 2.0999999046325684, 1.0889999866485596, 24.0])

Обратите внимание, что для работы с массивами в Python, необходимо импортировать библиотеку array . Кроме того, при создании массива нужно указывать, данные какого типа будут храниться в массиве. Так как созданный массив datas хранит данные типа float , то при создании массива мы указываем код типа ‘f’ .

2. Благодаря тому, что тип элементов массива известен во время его создания, массивы занимают меньше памяти и более эффективны по сравнению со списками. Для того чтобы убедиться в верности этого замечания, создадим массив и список с одинаковым содержимым, после чего проверим, сколько памяти занимают эти объекты в памяти:

Сравним, сколько места занимают массив и список с одинаковыми элементами:

# Cоздадим массив import array as arr arr1 = arr.array('i', [0, 1, 2, 3, 4, 5]) # Cоздадим список lst = [0, 1, 2, 3, 4, 5] # Сравним, сколько места занимают массив и # список с одинаковыми элементами from pympler import asizeof print('размер массива: ', asizeof.asizeof(arr1)) print('размер списка: ', asizeof.asizeof(lst))

Вывод на экран:

размер массива: 88 размер списка: 304

3. Списки встроены в Python, а массивы — нет. Поэтому для работы с массивами нужно импортировать модуль array .

В первом пункте мы уже обращали внимание на необходимость импорта библиотеки array для создания массивов. Повторим процесс создания массива, но на этот раз массив будет содержать данные целочисленного типа int :

import array as arr ar = arr.array('i', [3, 14, 15]) print(ar)

Вывод на экран:

array('i', [3, 14, 15])

Подведем итог: когда лучше использовать массивы, а когда — списки?

В тех случаях, когда необходима работа с большим количеством однотипных данных, использование массивов позволит Вам сэкономить память и время на обработку данных. В остальных случаях можно использовать списки!

Если Вам предстоит серьезная работа с большими объемами массивов, рекомендую дополнительно ознакомиться с библиотекой NumPy — эта библиотека позволит сотворить с массивами чудеса и облегчит жизнь Вам и Вашей машине!

Рекомендация от автора

У нас появился Telegram-канал для изучающих Python! Присоединяйтесь: вместе «питонить» веселее! �� Ссылка на канал: «Кодим на Python!»

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

На этом занятии мы свами познакомимся с основными методами, которые есть у списков. Что такое методы вам должно быть уже известно, об этом была речь, когда мы рассматривали методы строк. Кратко напомню, что список – это объект и с этим объектом связаны функции, которые и называются его методами.

Давайте предположим, что у нас имеется список из чисел:

a = [1, -54, 3, 23, 43, -45, 0]

и мы хотим в конец этого списка добавить еще одно значение. Это можно сделать с помощью метода:

a.append(100)

Данный метод append ничего не возвращает, а меняет сам список. Поэтому писать здесь конструкцию вида:

a = a.append(100)

не следует, так как это приведет к потере данных. Этим методы списков отличаются от методов строк, когда мы записывали:

string="Hello" string = string.upper()

Здесь метод upper возвращает измененную строку, поэтому все работает как и ожидается. А метод append ничего не возвращает, и присваивать значение None переменной a не имеет смысла.

Учитывая, что список может содержать самые разные данные, то в методе append можно прописывать не только число, но, например, строку:

a.append("hello")

тогда в конец списка будет добавлен этот элемент. Или, булевое значение:

a.append(True)

Или еще один список:

a.append([1,2,3])

И так далее. Главное, чтобы было указано одно конкретное значение. Например, вот так работать не будет:

a.append(1,2)

Если нам нужно вставить новый элемент в произвольную позицию, то используется метод:

a.insert(3, -1000)

Здесь мы указываем индекс вставляемого элемента и далее значение самого элемента.

Следующий метод remove удаляет элемент по значению:

a.remove(True) a.remove('hello')

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

a.remove('hello2')

то возникает ошибка. Еще один метод для удаления

a.pop()

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

end = a.pop()

Также в этом методе можно указывать индекс удаляемого элемента, например:

a.pop(3)

Если нам нужно очистить весь список – удалить все элементы, то можно воспользоваться методом:

a.clear()

Получим пустой список. Следующий метод

a = [1, -54, 3, 23, 43, -45, 0] c = a.copy()

возвращает копию списка. Это эквивалентно конструкции:

c = list(a)

В этом можно убедиться по разным id этих объектов:

id(c) id(a)

Следующий метод count позволяет найти число элементов с указанным значением:

c.count(1) c.count(-45)

Если же нам нужен индекс определенного значения, то для этого используется метод index:

c.index(-45) c.index(1)

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

c.index(1, 1)

Здесь поиск будет начинаться с индекса 1, то есть, со второго элемента. Или, так:

c.index(23, 1, 5)

Ищем число 23 с 1-го индекса и по 5-й не включая его. Если элемент не находится

c.index(23, 1, 3)

то метод приводит к ошибке. Чтобы этого избежать в своих программах, можно вначале проверить: существует ли такой элемент в нашем срезе:

23 in c[1:3]

и при значении True далее уже определять индекс этого элемента.

c.reverse()

меняет порядок следования элементов на обратный.

Ну и последний метод

c.sort()

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

c.sort(reverse=True)

Причем, этот метод работает и со строками:

lst = ["Москва", "Санкт-Петербург", "Тверь", "Казань"] lst.sort()

Здесь используется лексикографическое сравнение, о котором мы говорили, когда рассматривали строки.

Отличие метода sort() от ранее рассмотренной функции sorted() в том, что метод меняет сам список, а функция sorted() возвращает новый отсортированный список, не меняя начальный.

Это все основные методы списков, которые вам следует знать и применять в практике программирования:

Python List vs. Tuple

difference between list and tuple in python

В этой статье будет рассмотрена разница между списком и кортежем (List vs. Tuple).

List и Tuple в Python — это классы структур данных Python. Список является динамическим, тогда как кортеж имеет статические характеристики. Это означает, что списки могут быть изменены, тогда как кортежи не могут быть изменены, кортеж быстрее списка из-за статичности по своей природе. Списки обозначаются квадратными скобками, а кортежи обозначаются скобками.

Важные различия между List и Tuple в Python

List (список) Tuple (Кортеж)
1 Списки изменяемы Кортежи неизменны
2 Последствия итераций отнимают много времени Последствия итераций сравнительно быстрее
3 Список лучше подходит для выполнения операций, таких как вставка и удаление. Тип данных Tuple подходит для доступа к элементам
4 Списки потребляют больше памяти Кортеж потребляет меньше памяти по сравнению со списком
5 Списки имеют несколько встроенных методов. Tuple не имеет большого количества встроенных методов.
6 Более вероятны непредвиденные изменения и ошибки В кортеже это трудно осуществить.

Список против кортежа

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

# Creating a List with # the use of Numbers # code to test that tuples are mutable List = [1, 2, 4, 4, 3, 3, 3, 6, 5] print("Original list ", List) List[3] = 77 print("Example to show mutablity ", List)

Результат выполнения кода:

Исходный список [1, 2, 4, 4, 3, 3, 3, 6, 5] Пример для демонстрации изменчивости [1, 2, 4, 77, 3, 3, 3, 6, 5]

Пример с кортежем: далее мы увидим, что кортеж не может быть изменен.

tuple1 = (0, 1, 2, 3) tuple1[0] = 4 print(tuple1)

Результат выполнения кода:

Traceback (most recent call last): File "tuple_example.py", line 3, in tuple1[0]=4 TypeError: 'tuple' object does not support item assignment

Проверка эффективности работы кортежей с памятью

Поскольку кортежи хранятся в одном блоке памяти, им не требуется дополнительное пространство для новых объектов, в то время как списки размещаются в двух блоках: первый фиксированный со всей информацией об объектах Python, а второй блок переменного размера для данных.

import sys a_list = [] a_tuple = () a_list = ["Lemons", "And", "Apples"] a_tuple = ("Lemons", "And", "Apples") print(sys.getsizeof(a_list)) print(sys.getsizeof(a_tuple))

Результат выполнения кода:

120 64

Проверка скорости итераций в Tuple по сравнению с List

import sys, platform import time l=list(range(100000001)) t=tuple(range(100000001)) start = time.time_ns() for i in range(len(t)): a = t[i] end = time.time_ns() print("Total lookup time for Tuple: ", end - start) start = time.time_ns() for i in range(len(l)): a = l[i] end = time.time_ns() print("Total lookup time for LIST: ", end - start)

Результат выполнения кода:

Общее время поиска для Tuple: 7038208700 Общее время поиска для LIST: 19646516700

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *