Рубрики
Без рубрики

Списки: линейные контейнеры в Python

Списки Python. Теги с Python, учебником, новичками, функциональными.

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

Почему только Python, Ruby and Rust? Это субъективный выбор, и ответ – это потому, что это языки, которые мне нравятся больше всего. Конечно, подобные коллекции элементов существуют на других языках: Java, C ++, вы называете его.

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

В этой первой статье я буду решать списки Python. Я использую последнюю версию, поступаю с Linux Mint 19, версия 3.6.7:

Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Я дам несколько примеров для использования списков в Python, но я просто скажу о некоторых полезных функциях. Я сосредоточусь на других интересных аспектах списков, а не основных. Для списка подробных операций и функций в списках см. В официальной документации Python.

Создание списка в Python – простое кресть:

digits = [0,1,2,3,4,5,6,7,8,9] 
a = ["one", "two", "three", "four"]

# an empty list
empty = []

Вы можете смешивать типы:

mixed_list = ["one", 2, "three", 4]

Или даже создать список списков:

binomial_coefficients = [
    [1],
    [1,1],
    [1,2,1],
    [1,3,3,1],
    [1,4,6,4,1],
    [1,5,10,10,5,1]
]

Чтобы инициализировать список с одним и тем же элементом, просто используйте *:

['A'] * 5       # gives ['A', 'A', 'A', 'A', 'A']

Количество элементов списка дается встроенная функция Лен () :

len(binomial_coefficients)          # gives 6

Вы также можете хранить объекты, классы или функции в списке:

import math

# list of functions
trigo = [math.sin, math.cos, math.tan]

# list of lambdas
powers = [
    lambda x: x*x,
    lambda x: x*x*x,
    lambda x: x**4
]

# list of classes
collections = [list, dict, set]

# list of objects
empty_collections = [list(), dict(), set()]

Доступ к элементам

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

first_binomial = binomial_coefficients[0]
last_binomial = binomial_coefficients[-1]
fifth_binomial = binomial_coefficients[-2]
len(binomial_coefficients[4]) # gives 5

Сублисты возможны с использованием ломтиков индекса:

first3_binomials = binomial_coefficients[0:3]

Список операций

  • Добавление элемента
digits.append(10)
  • Удаление элемента по индексу
del digits[10]
  • объединяющие списки
digits = [0,1,2,3,4] + [5,6] + [7,8,9]
  • Членство в тестировании элемента
if 9 in digits:
    print("9 is a digit! Such a surprise ;-)")

Зацикливаться через список

Используйте встроенную конструкцию:

for d in digits:
    print(d)

Чтобы получить индекс элемента при закреплении, используйте встроенный перечислять () Функция:

for i,d in enumerate(digits):
    print(f"{d} is the {i}-th digit")

Некоторые полезные функции в списках

digits = [0,1,2,3,4,5,6,7,8,9]
sum(digits)         # gives 45
max(digits)         # gives 9
min(digits)         # gives 0

# min & max could also be used with other types, with the key keyword argument
lipsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.".split()

# get any word being the longest
max(lipsum, key=len)           # gives 'consectetur'

zip () Встроенная функция сочетает в себе несколько списков для создания потенциальных кортежей, созданных путем принятия I-X-элемента каждого списка:

a = [0,1,2,3]
b = [0,1,2,3]

# display tuples
for i in zip(a,b):
    print(i)

Сообщение списка

Попределения списка являются эффективным способом создания новых списков или извлеченных элементов из списка:

# extract words ending with 't'
lipsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.".split()
end_with_t = [w for w in lipsum if w.endswith('t')]  # gives ['sit', 'incididunt', 'ut', 'et']

# convert to uppercase
[w.upper() for w in lipsum]

# get only words of length 5 (including commas)
[w for w in lipsum if len(w) == 5]    # gives ['Lorem', 'ipsum', 'dolor', 'amet,', 'elit,', 'magna']

# create new objects from a list of classes
[c() for c in [list, dict, set]]

# get pi/4 value from trigonometric functions list
import math
trigo = [math.sin, math.cos, math.tan]
[f(math.pi/4) for f in trigo]

Вы также можете использовать вложенную итерацию с помощью:

a = [0,1,2,3]
b = [0,1,2,3]
[[i,j] for i in a for j in b] # gives [[0, 0], [0, 1], [0, 2], [0, 3], [1, 0], [1, 1], [1, 2], [1, 3], [2, 0], [2, 1], [2, 2], [2, 3], [3, 0], [3, 1], [3, 2], [3, 3]]

Но остерегайтесь это декартовому продукту:

a = [0,1,2,3]
b = [0,1,2,3]

# this doesn't give the summation of both lists
[i+j for i in a for j in b] # gives [0, 1, 2, 3, 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6]

Используйте это, чтобы получить суммирование элементов.

a = [0,1,2,3]
b = [0,1,2,3]
[x+y for i,x in enumerate(a) for j,y in enumerate(b) if i == j] # gives [0, 2, 4, 6]

# gives the same result
[i+j for (i,j) in list(zip(a,b))]

Использование встроенного списка () функция

Встроенный Список () Функция очень мощная для создания списков в кратком и эффективном способе. Как только товар вы переходите в Список () ИТСИТЕТ, он использует свой итератор для создания списка:

# this creates a list of a-z chars
a_to_z = list("abcdefghijklmnopqrstuvwxyz")

# create digits and the first 100 even numbers
digits = list(range(10))
even = list(range(0,100,2))

# list() is idempotent, but this creates another list, not another reference
list(digits)  # gives back a copy of digits 

Это, очевидно, работает для пользовательских итераторов:

class One:
    def __iter__(self):
        yield "one"
        yield "un"
        yield "ein"
        yield "uno"

# gives ['one', 'un', 'ein', 'uno']
print(list(One()))

Наследование класса списка

Ничто не мешает вам подкласс Список Класс, чтобы создать свои собственные пользовательские списки. Этот пример реализует способ доступа к элементам списка, давая несколько индексов:

""" Based on list, but accept sparse indexes """
class MyList(list):
    def __getitem__(self, *args):
        # if only one index, just return the element as usual
        if type(args[0]) == int or type(args[0]) == slice:
            return list.__getitem__(self, args[0])
        # otherwise build a list with asked indexes
        else:       
            return [x for i,x in enumerate(self) if i in args[0]]

my_list = MyList(list("abcdefghijklmnopqrstuvwxyz"))
print(my_list[0])           # gives 'a'
print(my_list[0:2])         # gives ['a', 'b']
print(my_list[0,24,25])     # gives ['a', 'y', 'z']

Действуя в списках

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

карта()

Используя карта () Встроенная функция, можно получить изображение отображения в списке. Если вы рассматриваете список в качестве математического набора элементов, карта () Дает изображение, установленное через рассмотренную функцию.

a_to_z = list("abcdefghijklmnopqrstuvwxyz")
A_to_Z = list(map(str.upper, a_to_z))

карта () Сам отдает обратно объект карты, который является итеративным, вот почему, чтобы получить список, Список () Функция необходима.

Конечно, функция карты проходит как первый аргумент, может быть любая функция, и любая лямбда, имеющая один аргумент:

digits = [0,1,2,3,4,5,6,7,8,9]
list(map(lambda x: x*10, digits))        # gives tenths

# refer to binomial_coefficients above
list(map(sum, binomial_coefficients))   # gives [1, 2, 4, 8, 16, 32]

или даже определенная пользовательская функция:

# contrived example
def square(x):
    return x*x

# calculate first 9 perfect squares
digits = [0,1,2,3,4,5,6,7,8,9]
print(list(map(square, digits)))
  • фильтр()

В качестве его имени предлагается, эта встроенная функция используется для сита элементов из списка, используя некоторые критерии. Элементы хранятся те, где функция, приведенная как первый аргумент для Фильтр () возвращается Правда Отказ

# extract even numbers
digits = [0,1,2,3,4,5,6,7,8,9]
list(filter(lambda x: x%2 == 0, digits))        # gives [0, 2, 4, 6, 8]

# extract words less than 4 chars
lipsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.".split()
print(list(filter(lambda w: len(w) < 4, lipsum)))   # gives ['sit', 'sed', 'do', 'ut', 'et']
  • уменьшать()

Начиная с Python3, Уменьшить () Функция была перемещена в functools модуль. Он в основном уменьшается для одного значения, приведя приводит к функции.

Итак, Уменьшить (функция, неиспользуемый, инициализатор) может быть определен как:

let f a Python function, a=(a0,a1,...., an) an iterable giving (n+1) values, then:

reduce(f,a,init) = f(.....f(f(f(init,a0), a1), a2)....., an)

Примеры:

from functools import reduce

digits = list(range(10))

# sum of first 10 digits
reduce(lambda x,y: x+y, digits)   # gives 45

# this uses an initializer
reduce(lambda x,y: x+y, digits, 10) # gives 55 = 45+10

# a more sophisticated example: this uses the nested multiplication to compute the value of a polynomial, given its coefficients and the unknown value z (uses type hinting btw)
def nested(z: int, coeff: list) -> int:
    res = reduce(lambda x,y: z*x+y, coeff)
    return res

# easy computation of the nested square root which converges to the golden ratio
import math
reduce(lambda x,y: math.sqrt(x+y), [1]*100)   # gives 1.618033988749895

# same for the canonical continued fraction
reduce(lambda x,y: y+1/x, [1]*100)

# this sums all columns of a matrix
matrix = [[i]*4 for i in range(4)]
reduce(lambda a,b: [x+y for i,x in enumerate(a) for j,y in enumerate(b) if i == j], matrix) # gives [6, 6, 6, 6]

В следующем посте я объясню рубиновые массивы.

Фото Сьюзен Инь на Unspplash

Оригинал: “https://dev.to/dandyvica/lists-arrays-vectors-linear-containers-in-python-ruby-and-rust-17mn”