× К оглавлению На главную Об авторе

Дата и время публикации:    

Назначение и использование

1. Назначение

Рассматриваются два метода слияния массивов данных (списков):

Например, целочисленных, строковых и аргументов, в т.ч. списков с ключевыми параметрами.

2. Использование

2.1 Метод конкатенации

Широко применяемый метод при операции со строками, когда, например, нужно составить вместе первое и последнее слова с пробелом по середине: first_name + " " + last_name


first_name = "Vova"
last_name = "Petrov"
your_name = first_name + " " + last_name

first_name + " " + last_name
print(s) # "Vova Petrov"

Кроме списков со строковыми значениями, также может быть применим к обычным целочисленным.


a = [1,2,3,4,5]
b = [6,7,8,9,0]
c = a + b

print(c) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

2.2 Использование оператора звездочки (подстановки всего списка путем наложением или простым шлепком)

Альтернативой конкатенации является использование оператора "шлепка" (splat operator) в пределах области действия списка через символ звездочки (*), применимый в основном с двумя типами переменных *args (список аргументов) или (списков ключевых параметров). При этом этот оператор не относится к специальными переменным Python, а является стандартным обозначением "шлепочного" оператора (splat operator), который производит наложение, подстановку и/или вставки списка и также широко применяется в PHP

Примечания. Так данный "шлепочный" оператор вываливает многочисленные значения и имеет два типа функциональных параметров. Так *args является сокращенным названием списка аргументов, а **kwargs сокращенным названием списка ключевых аргументов и также используется в функциях для передачи списков, которые наглядно показывают результат их применения. Пример использования передачи списка аргументов:
def printScores(student, *scores):
  print(f"Student Name: {student}")
  for score in scores:
     print(score)

printScores("Jonathan",100, 95, 88, 92, 99)
При этом, исходя их текста функции printScores(), первый аргумент функции – имя студента, а во втором, списке числовых значений *scores, передаются его оценки:
"""
Student Name: Jonathan
100
95
88
92
99
"""
Пример использования передачи списка ключевых аргументов:
def printPetNames(owner, **pets):
     print(f"Owner Name: {owner}")
     for pet,name in pets.items():
          print(f"{pet}: {name}")

printPetNames("Jonathan", dog="Brock", fish=["Larry", "Curly", "Moe"], turtle="Shelldon")
В случае с ключевыми параметрами вида key={values_list}, все переданные в списке ключевые параметры будут выведены после имени владельца живности будут перечислены их клички в **pets :
Owner Name: Jonathan
dog: Brock
fish: ['Larry', 'Curly', 'Moe']
turtle: Shelldon   

Данный оператор “вывалит” комплексные данные, такие как список или базу словаря, чтобы получить, в свою очередь, результирующий список слияния, а сливаемые списки должны быть "выложены" один в один.

a = [1,2,3,4,5]
b = [6,7,8,9,0]

c = [*a, *b]
print(c) #  [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
c = [*b,*c]
print(c) # [6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

Тоже самое и со строками, перечисленные строковыми значений в списках: фрукты "fruities" и овощи "vegies":

fruities=['apple','orange','banana','lemon']
vegies=['broccoli','potato','cucumber','tomato']
box={*fruities,*vegies}

print(box)  # {'potato', 'lemon', 'banana', 'broccoli', 'cucumber', 'orange', 'tomato', 'apple'}

Для списков ключевых параметров верно следующее

x = {'n1': 1, 'n2': 2} 
y = {'n2': 10, 'n3': 11}
Z = {**x, **y}

print(Z) # {'n1': 1, 'n2': 10, 'n3': 11}

При этом, как можно увидеть в списки ключевых параметров содержат по два ключевых аргумента, а в списке объединения только 3. Почему? Потому что в процессе слияние списка X и Y, было произведено слияние с наложением, в результате которого было произведено замещение значения 2 ключа ‘n2’ на значение 10 ключа с тем же именем из списка Y.

Таким образом, в результате получим обновление списка Z, если

update = {'n1': 100, 'n2': 200} 
Z = {**Z, **update}

print(Z) # {'n1': 100, 'n2': 2000, 'n3': 11}

При этом, подобное не случится со списком аргументов, потому что будем иметь место чистое слияние множества элементов обоих списков без эффекта наложения:

a = [1,2,3,4,5]
b = [5,7,8,9,0]
c = [*b,*a]
print(c) # [5, 7, 8, 9, 0, 1, 2, 3, 4, 5]

c = [*a,*b]
print(c) # [1, 2, 3, 4, 5, 5, 7, 8, 9, 0]

Библиография

3.1 How To Merge Two Lists in Python

3.2 What Are *args and **kwargs in Python?

3.3 How do I merge two dictionaries in a single expression in Python (taking union of dictionaries)?

3.4 The Idiomatic Way to Merge Dictionaries in Python

Сайт разработан в соответствии с рекомендациями консорциума W3C для языка разметки HTML5.

Об авторе можно прочитать здесь.

Copyright © 2015-2019 Андрей Ржавсков