python中的列表生成式、生成器和字典推导式

1、列表生成式

举一个简单的例子,输出1-20之间的奇数。

  • 一般做法
my_list = []
for i in range(21):
    if i % 2 == 1:
        my_list.append(i)

print(my_list)
# [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
  • 列表生成式
print([i for i in range(21) if i % 2 == 1])
# [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

更复杂一些的逻辑(将输出的1-20之间的奇数分别取平方)

def handel_item(item):
    return item * item

print([handel_item(i) for i in range(21) if i % 2 == 1])

# [1, 9, 25, 49, 81, 121, 169, 225, 289, 361]

2、生成器

首先来说,将列表生成式中的[],换成(),就变成了一个生成器。

my_list = (i for i in range(21) if i % 2 == 1)
print(type(my_list))
print(my_list)

# <class 'generator'>
# <generator object <genexpr> at 0x0000022BDABA64C8>

可通过for循环输出每个元素

my_list = (i for i in range(21) if i % 2 == 1)
for i in my_list:
    print(i)

#1 3 5 7 9 11 13 15 17 19

生成器和列表表达式之间的转换

my_list = (i for i in range(21) if i % 2 == 1)

print(my_list)
new_list = list(my_list)
print(new_list)

# <generator object <genexpr> at 0x000002D5D63D64C8>
# [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

还可以通过yield构造生成器,后续再讲解。

3、字典推导式

交换键值顺序

my_dict = {
    
    "bobby1": 22, "bobby2": 23, "ming": 5}

reverse_dice = {
    
    value: key for key, value in my_dict.items()}

print(reverse_dice)
# {22: 'bobby1', 23: 'bobby2', 5: 'ming'}

补充:集合推导式

my_set = {
    
    key for key,value in my_dict.items()}
print(my_set)
print(type(my_set))
# {'bobby1', 'bobby2', 'ming'}
# <class 'set'>

虽然直接用my_set = set(my_dict.keys())也行,但灵活性不高,也不像字典推导式那样可以添加任意逻辑。

猜你喜欢

转载自blog.csdn.net/weixin_43901214/article/details/106979641
今日推荐