Дата и время публикации:
Назначение и использование
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
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)?