Python распаковать массив массивов

How to Unpack a List in Python

Summary: in this tutorial, you’ll learn how to unpack a list in Python to make your code more concise.

Introduction to the list unpacking

The following example defines a list of strings:

colors = ['red', 'blue', 'green']Code language: Python (python)

To assign the first, second, and third elements of the list to variables, you may assign individual elements to variables like this:

red = colors[0] blue = colors[1] green = colors[2] Code language: Python (python)

However, Python provides a better way to do this. It’s called sequence unpacking.

Basically, you can assign elements of a list (and also a tuple) to multiple variables. For example:

red, blue, green = colorsCode language: Python (python)

This statement assigns the first, second, and third elements of the colors list to the red , blue , and green variables.

In this example, the number of variables on the left side is the same as the number of elements in the list on the right side.

If you use a fewer number of variables on the left side, you’ll get an error. For example:

colors = ['red', 'blue', 'green'] red, blue = colors Code language: Python (python)
ValueError: too many values to unpack (expected 2)Code language: Python (python)

In this case, Python could not unpack three elements to two variables.

Unpacking and packing

If you want to unpack the first few elements of a list and don’t care about the other elements, you can:

  • First, unpack the needed elements to variables.
  • Second, pack the leftover elements into a new list and assign it to another variable.

By putting the asterisk ( * ) in front of a variable name, you’ll pack the leftover elements into a list and assign them to a variable. For example:

colors = ['red', 'blue', 'green'] red, blue, *other = colors print(red) print(blue) print(other) Code language: Python (python)
red blue ['green']Code language: Python (python)

This example assigns the first and second elements of the colors list to the red and green variables. And it assigns the last element of the list to the other variable.

colors = ['cyan', 'magenta', 'yellow', 'black'] cyan, magenta, *other = colors print(cyan) print(magenta) print(other) Code language: Python (python)
cyan magenta ['yellow', 'black']Code language: Python (python)

This example assigns the first and second elements to variables. It packs the last two elements in a new list and assigns the new list to the other variable.

Summary

  • Unpacking assigns elements of the list to multiple variables.
  • Use the asterisk (*) in front of a variable like this *variable_name to pack the leftover elements of a list into another list.

Источник

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

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

Разберем префиксные операторы * и ** , которые ставятся перед переменными для распаковки или упаковки коллекций.

Распаковка в переменные

Распаковка кортежей

Кортеж можно распаковать в отдельные элементы:

a, b = (1, 2) print(a) print(b) #1 #2

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

a, b = (1, 2, 3, 4) print(a) print(b) #ValueError: too many values to unpack (expected 2)

Можно воспользоваться оператором распаковки * :

a, *b = (1, 2, 3, 4) print(a) print(b) #1 #[2, 3, 4]

В результате первый элемент кортежа будет присвоен первой переменной a , а все остальные элементы (уже в виде списка) — переменной b .

Также можно сделать и наоборот:

*a, b = (1, 2, 3, 4) print(a) print(b) #[1, 2, 3] #4

Переменной b будет присвоен последний элемент кортежа, а все остальные будут присвоены переменной a в виде списка.

a, *b, c = (1, 2, 3, 4) print(a) print(b) print(c) #1 #[2, 3] #4

Крайние элементы кортежа присваиваются переменным a и c , а все остальное попадает в переменную b .

Распаковка списков

a, *b = [1, 'два', 3, False] print(a) print(b) #1 #['два', 3, False]

Распаковка строк

a, *b, c = 'fullstacker.ru' print(a) print(b) print(c) #f #['u', 'l', 'l', 's', 't', 'a', 'c', 'k', 'e', 'r', '.', 'r'] #u

Распаковка множеств

s = a, *b = s print(a) print(b) #1 #[2, 4]

Распаковка словарей

d1 = a, *b = d1 print(a) print(b) #key1 #['key2', 'key3']

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

d1 = a, *b = d1.values() print(a) print(b) #val1 #['val2', 'val3']

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

d1 = a, *b = d1.items() print(a) print(b) #('key1', 'val1') #[('key2', 'val2'), ('key3', 'val3')]

Распаковка кортежей без переменных

Зачем это вообще может понадобиться?

К примеру, нам нужно получить числовой диапазон из значений кортежа.

Создадим кортеж из двух значений:

Если мы в функцию range() передадим кортеж d , то получим ошибку:

d = 5, 10 print(range(d)) #TypeError: 'tuple' object cannot be interpreted as an integer

Поскольку range() ожидает в качестве аргументов 2 значения, а не кортеж из двух значений.

Но мы можем распаковать кортеж с помощью оператора * :

d = 5, 10 print(range(*d)) #range(5, 10)

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

d = 5, 10 print(list(range(*d))) #[5, 6, 7, 8, 9]
d = 5, 10 print([*range(*d)]) #[5, 6, 7, 8, 9]

Распаковка словарей

Мы получили ключи словаря.

А если использовать метод values :

d = print(*d.values()) #val1 val2 val3

Если же использовать метод items :

d = print(*d.items()) #('key1', 'val1') ('key2', 'val2') ('key3', 'val3')

Получим кортежи из ключей и значений словаря.

Распаковка списков

lst = [1, 2, 3, 4] print(*lst) #1 2 3 4

Объединение итерируемых объектов

С помощью оператора * , можно не только распаковывать, но и объединять итерируемые объекты:

d = 5, 10 e = ('один', 'два', 'три') f = [True, False] print([*range(*d), *e, *f]) #[5, 6, 7, 8, 9, 'один', 'два', 'три', True, False]

Точно также объединение работает и с другими типами данных:

my_tuple = (1, 2, 3) print((0, *my_tuple, 4)) my_set = print() #(0, 1, 2, 3, 4) #

Объединили в один список — числовой диапазон, кортеж и список.

Объединение двух словарей с помощью **

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

Упаковка в функциях

Операторами * и ** также удобно пользоваться и в функциях. Это дает возможность вызывать функцию с произвольным количеством позиционных аргументов и именованных аргументов.

def my_function(*args, **kwargs): print(args) print(kwargs) my_function(1, 2, 3, a=10, b=20) #(1, 2, 3) #

После вызова функции мы получили кортеж args позиционных аргументов и словарь kwargs именованных аргументов.

Основные способы определения палиндрома в строке на языке Python

Основные способы определения палиндрома в строке на языке Python

Удаление элементов из списка Python: подробное объяснение с примерами

Удаление элементов из списка Python: подробное объяснение с примерами

Метод isascii() в Python: как проверить, что строка содержит только ASCII символы

Метод isascii() в Python: как проверить, что строка содержит только ASCII символы

Методы lower() и upper() в Python: переводим строки в нижний и верхний регистр

Методы lower() и upper() в Python: переводим строки в нижний и верхний регистр

Эффективные подходы к подсчету вложенных списков в Python

Эффективные подходы к подсчету вложенных списков в Python

Преобразование строк в нижний регистр с помощью метода casefold() в Python

Преобразование строк в нижний регистр с помощью метода casefold() в Python

Источник

Python распаковать массив массивов

Распаковка ( unpacking , также называемая Деструктуризация ) представляет разложение коллекции (кортежа, списка и т.д.) на отдельные значения.

Так, как и многие языки программирования, Python поддерживает концепцию множественного присваивания. Например:

x, y = 1, 2 print(x) # 1 print(y) # 2

В данном случае присваивем значения сразу двум переменным. Присвоение идет по позиции: переменная x получает значение 1, а переменная y — значени 2.

Данный пример в действительности уже представляет деструктуризацию или распаковку. Значения 1, 2 фактически являются кортежом, поскольку именно запятые между значениями говорят о том, что это кортеж. И мы также могли бы написать следующим образом:

x, y = (1, 2) print(x) # 1 print(y) # 2

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

Подобным образом можно разложить другие кортежи, например:

name, age, company = ("Tom", 38, "Google") print(name) # Tom print(age) # 38 print(company) # Google

Только кортежами мы не ограничены и можем «распаковывать» и другие коллекции, например, списки:

people = ["Tom", "Bob", "Sam"] first, second, third = people print(first) # Tom print(second) # Bob print(third) # Sam

При разложении словаря переменные получают ключи словаря:

dictionary = r, b, g = dictionary print(r) # red print(b) # blue print(g) # green # получаем значение по ключу print(dictionary[g]) # зеленый

Деструктуризация в циклах

Циклы в Python позволяют разложить коллекции на отдельные составляющие:

people = [ ("Tom", 38, "Google"), ("Bob", 42, "Microsoft"), ("Sam", 29, "JetBrains") ] for name, age, company in people: print(f"Name: , Age: , Company: ")

Здесь мы перебираем список кортежей people. Каждый кортеж состоит из трех элементов, соответственно при переборе мы можем их передать в переменные name, age и company.

Другой пример — функция enumerate() . Она принимает в качестве параметра коллекцию, создает для каждого элемента кортеж и возвращает набор из подобных кортежей. Каждый кортеж содержит индекс, который увеличивается с каждой итерацией:

people = ["Tom", "Bob", "Sam"] for index, name in enumerate(people): print(f".") # результат # 0.Tom # 1.Bob # 2.Sam

Игнорирование значений

Если какой-то элемент коллекции не нужен, то обычно для него определяется переменная с именем _ (прочерк):

person =("Tom", 38, "Google") name, _, company = person print(name) # Tom print(company) # Google

Здесь нам не важен второй элемент кортежа, поэтому для него определяем переменную _. Хотя в реальности _ — такое же действительное имя, как name и company:

name, _, company = person print(_) # 38

Упаковка значений и оператор *

Оператор * упаковывает значение в коллекцию. Например:

num1=1 num2=2 num3=3 *numbers,=num1,num2,num3 print(numbers) #[1, 2, 3]

Здесь мы упаковываем значения из кортежа (num1,num2,num3) в список numbers. Причем, чтобы получить список, после numbers указывается запятая.

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

head, *tail = [1, 2, 3, 4, 5] print(head) # 1 print(tail) # [2, 3, 4, 5]

Здесь переменная head в соответствии с позицией получае первый элемент списка. Все остальные элементы передаются в переменную tail . Таким образом, переменная tail будет представлять список из оставшихся элементов.

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

*head, tail = [1, 2, 3, 4, 5] print(head) # [1, 2, 3, 4] print(tail) # 5

Или элементы по середине, кроме первого и последнего:

head, *middle, tail = [1, 2, 3, 4, 5] print(head) # 1 print(middle) # [2, 3, 4] print(tail) # 5

Или все кроме первого и второго:

first, second, *other = [1, 2, 3, 4, 5] print(first) # 1 print(second) # 2 print(other) # [3, 4, 5]

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

Другой пример — нам надо получить только первый, третий и последний элемент, а остальные элементы нам не нужны. В общем случае мы должны предоставить переменные для всех элементов коллекции. Однако если коллекция имеет 100 элементов, а нам нужно только три, не будем же мы определять все сто переменных. И в этом случае опять же можно применить упаковку:

first, _, third, *_, last = [1, 2, 3, 4, 5, 6, 7, 8] print(first) # 1 print(third) # 3 print(last) # 8

Также можно получить ключи словаря:

red, *other, green = print(red) # red print(green) # green print(other) # ['blue', 'yellow']

Распаковка и операторы * и **

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

nums1 = [1, 2, 3] nums2 = (4, 5, 6) # распаковываем список nums1 и кортеж nums2 nums3 = [*nums1, *nums2] print(nums3) # [1, 2, 3, 4, 5, 6]

Здесь распаковывем значения из списка nums1 и кортежа nums2 и помещаем их в список nums3.

Подобным образом раскладываются словари, только применяется оператор ** :

dictionary1 = dictionary2 = # распаковываем словари dictionary3 = <**dictionary1, **dictionary2>print(dictionary3) #

Источник

Читайте также:  Javascript regex replace all but
Оцените статью