Python. Использование вложенных конструкций if и for в генераторах списков, множеств и словарей

Использование вложенных конструкций if и for в генераторах списков, множеств и словарей


Содержание


1. Вложенные конструкции if и for в генераторах списков, множеств и словарей. Общие понятия

В генераторах списков, множеств и словарей можно использовать:

  • конструкции if с целью фильтрации результирующих данных;
  • вложенные конструкции for в целях обхода нужных данных.

 

2. Примеры с использованием расширенной конструкции if
2.1. Формирование словаря на основе двух списков

Задача. Заданы 2 списка L1 и L2 одинаковой длины. Образуйте словарь D, в котором элементы списка L1 являются ключами, а элементы списка L2 являются значениями. В словарь включите только те элементы, в которых ключи находятся в диапазоне [5; 10].

Решение.

# Генераторы словарей и вложенные конструкции if

# Заданы 2 списка
numbers = [ 12, 8, 3, 10, 7, 19 ]
strings = [ '1', '22', '333', '4444', '55555', '666666' ]

# Образовать словарь, в котором ключи находятся в пределах [5; 10]
D = { k:v for (k,v) in zip(numbers, strings) if ((k>=5) and (k<=10)) }

# Вывести словарь D
print(D)

Результат выполнения программы

{8: '22', 10: '4444', 7: '55555'}

 

2.2. Формирование множества, содержащее только четные числа

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

Решение.

# Генераторы множеств и вложенные конструкции if

# 1. Подключить модуль random
import random

# 2. Задать количество чисел
n = int(input("n = "))

# 3. Создать список из n чисел, каждое число в пределах [1; 10]
L = [ random.randint(1, 10) for t in range(1, n+1) ]

# 4. Создать множество, в котором только парные элементы
S = { x for x in L if x%2 == 0 }

# 5. Вывести результат
print("L = ", L)
print("S = ", S)

Результат выполнения программы

n = 12
L = [5, 9, 10, 4, 2, 4, 7, 10, 3, 6, 10, 2]
S = {10, 2, 4, 6}

 

2.3. Формирование списка на основе двух списков согласно условию

Условие задачи. Задано два списка строк L1 и L2. На основе этих списков образовать третий список L3, содержащий только строки, длина которых превышает 3 символа.

Решение.

# Генераторы списков и вложенные конструкции if

# 1. Задано 2 списка
L1 = [ 'abc', 'abcd', '1232', '5555', '200', 'jk' ]
L2 = [ 'jklmn', 'jprst', 'aaa', '77' ]

# 2. Создать результирующий список

# 2.1. Получить подсписок результатов на основе списка L1
ResL1 = [ item for item in L1 if len(item)>3 ]

# 2.2. Получить подсписок результатов на основе списка L2
ResL2 = [ item for item in L2 if len(item)>3 ]

# 2.3. Получить результирующий список
ResL = ResL1 + ResL2

# 3. Вывести результат
print("ResL = ", ResL)

Результат выполнения программы

ResL = ['abcd', '1232', '5555', 'jklmn', 'jprst']

 

3. Примеры с использованием вложенной конструкции for
3.1. Использование вложенных конструкций for в генераторах словарей

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

# Вложенные конструкции for в словарях

# 1. Образовать словарь из заданного диапазона
D1 = { k : v for k in range(1, 4) for v in range(10, 13) }
print("D1 = ", D1)

# 2. Создание словаря на основе двух других списков
D2 = { k : v for k in ['a', 'b', 'c'] for v in [7, 8, 9] }
print("D2 = ", D2)

Результат выполнения программы

D1 = {1: 12, 2: 12, 3: 12}
D2 = {'a': 9, 'b': 9, 'c': 9}

Как следует из результата, к словарю прилагаются не все возможные варианты пар k:v. Это связано с тем, что в словарях не допускается появление дубликатов.

 

3.2. Использование вложенных циклов for в генераторах множеств

В примере демонстрируется использование вложенных циклов for в генераторах множеств для решения следующих задач:

  • образовать множество, включающее сумму всех возможных значений из заданных списков;
  • создать все возможные наборы символов из двух произвольных строк.

 

# Генераторы множестс и вложенные конструкции for

# 1. Заданы 2 списка
L1 = [ 1, 3, 5, 5, 7, 8, 9 ]
L2 = [ 3, 3, 4, 5, 6, 7, 8, 9 ]

# 2. Образовать множество, включающее сумму всех возможных значений из списков
S = { x + y for x in L1 for y in L2 }
print(S)

# 3. Образовать множество пар из значений символьного набора
S2 = { (x, y) for x in 'ab' for y in '12' }
print(S2)

Результат выполнения программы

{4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}
{('b', '2'), ('a', '1'), ('a', '2'), ('b', '1')}

 

3.3. Использование вложенных циклов for в генераторах списков

Демонстрируется использование вложенной конструкции for в генераторе списков. Решаются следующие задачи:

  • создать список, каждый элемент которого является поэлементной суммой двух кортежей;
  • на основе двух списков строк создать новый список, содержащий общие для обоих списков строки.
# Генераторы списков и вложенные конструкции for

# 1. Заданы 2 кортежа
T1 = ( 7.2, 8.1, 3.5, 4.4, 2.9 )
T2 = ( 1.6, 0.8, 9.1, 3.3, 8.2 )

# 2. Образовать список, являющийся поэлементной суммой двух кортежей
L1 = [
    T1[p1]+T2[p2]
    for p1 in range(len(T1))
    for p2 in range(len(T2))
    if p1==p2
    ]

print(L1)

# 3. Образовать список, содержащий строки, одинаковые в двух списках S1, S2
S1 = [ '12', '34', '56', '23' ]
S2 = [ '78', '90', '12', '34', '77' ]

L2 = [
    S1[p1]
    for p1 in range(len(S1))
    for p2 in range(len(S2))
    if S1[p1]==S2[p2]
    ]

print(L2)

Результат выполнения программы

[8.8, 8.9, 12.6, 7.7, 11.1]
['12', '34']

 


Связанные темы