day09:04一文搞懂 Python 3 中的列表推导式

简介:

列表推导式(ListComprehension)是Python中一种非常强大且简洁的构建列表的方式。它允许你从一个或多个可迭代对象(如列表、元组、字符串等)中快速生成新的列表,同时可以对元素进行过滤、转换等操作。列表推导式比传统的循环语句更加简洁易读,是Python编程中常用的技巧之一。

基本语法

列表推导式的基本语法如下:

python
[expression for item in iterable if condition]

expression:这是列表中的每个元素将要进行的操作或转换。它可以是任何有效的Python表达式,并且会使用当前迭代到的元素(item)进行计算。
item:这是可迭代对象(iterable)中每次迭代时的元素变量名。你可以根据需要更改这个名称。
iterable:这是要进行迭代的可迭代对象,比如列表、元组、字符串等
condition(可选):这是一个条件表达式,用于过滤掉不满足条件的元素。只有当条件为真时,当前的item才会被包含在结果列表中。如果省略此条件,所有元素都会被包含。

<示例>

1. 基本示例

python生成一个包含1到10的平方的列表

squares = [x**2 for x in range(1, 11)]  
print(squares)  

'''输出: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]'''

2. 带条件的列表推导式

python 生成一个包含1到10之间的偶数的平方的列表

even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]  
print(even_squares)  

'''输出: [4, 16, 36, 64, 100]'''

3. 嵌套列表推导式

列表推导式也可以嵌套使用,以处理更复杂的数据结构。

'''需求:假设我们有一个二维列表,我们想将其转换成一个新的二维列表,其中每个子列表只包含原列表中的偶数 '''
 
matrix = [  
    [1, 2, 3],  
    [4, 5, 6],  
    [7, 8, 9]  
]  
  
'''使用嵌套列表推导式'''  
even_matrix = [[x for x in row if x % 2 == 0] for row in matrix]  
print(even_matrix)    

''' 输出: [[2], [4, 6], [8]]'''

4. 结合其他数据结构

列表推导式不仅可以用于列表,还可以与元组、集合、字典等其他数据结构结合使用,但结果总是列表。

'''使用列表推导式生成元组的列表  '''
tuples_list = [(x, x**2) for x in range(1, 4)]  
print(tuples_list)  
# 输出: [(1, 1), (2, 4), (3, 9)]  
  
'''使用集合推导式(注意:这不是列表推导式,但展示了类似的概念)  '''
squares_set = {x**2 for x in range(1, 4)}  
print(squares_set)  
# 输出可能因Python版本和哈希表实现而异,但通常是 {1, 4, 9}  
  
'''列表推导式生成字典的项,然后转换成字典 ''' 
dict_items = [(str(x), x**2) for x in range(1, 4)]  
square_dict = dict(dict_items)  
print(square_dict)  
# 输出: {'1': 1, '2': 4, '3': 9}

5.优点

简洁性:列表推导式可以用一行代码完成传统循环需要多行才能完成的工作。
可读性:对于熟悉Python的人来说,列表推导式往往比等效的循环语句更易于阅读和理解。
效率:在某些情况下,列表推导式可能比等效的循环语句更高效,因为Python的内部实现可能会对其进行优化

6.注意事项

列表推导式生成的是新列表,不会修改原始可迭代对象。 在处理大型数据集时,如果不需要立即使用结果列表,或者担心内存消耗,可能需要考虑使用生成器表达式(generator expressions)作为替代,因为它们是按需生成元素,而不是一次性生成整个列表。

7.案例

'''需求:有如下值集合 [11,22,33,44,55,66,77,88,99,90,91,92,99,100],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中
即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
'''

set_l = [11,22,33,44,55,66,77,88,99,90,91,92,99,100]

dic = {}
lst1 = []
lst2 = []

for  num in set_l:
    if num > 66:
        lst1.append(num)
        # dic['k1'] = lst1.append(num) 
        # 上面的lst1.append(num) 属于列表的就地操作,只会返回None,故后面打印出的字典为{‘k1':None, 'k2':None}                        
    else:
        lst2.append(num)
        # dic['k2'] = lst2.append(num)

dic['k1'] = lst1
dic['k2'] = lst2
print(dic)

上述代码存在几个问题,主要是关于列表的 append 方法和字典的赋值。append 方法是列表的一个就地(in-place)操作,它不会返回任何值(实际上是返回 None,因此直接将其结果赋值给字典的键是不正确的。

使用列表推导式简化代码,如下:

set_l = [11,22,33,44,55,66,77,88,99,90,91,92,99,100]

dic = {'k1':None, 'k2':None}

key1_words = [value for value in set_l if value > 66]
print(f'key1_words: {key1_words}')

key2_words = [value for value in set_l if value <= 66]
print(f'key2_words:{key2_words}')

dic['k1'] = key1_words # key1_words: [77, 88, 99, 90, 91, 92, 99, 100]
dic['k2'] = key2_words # key2_words:[11, 22, 33, 44, 55, 66]
print(f'dic:  {dic}') # dic:  {'k1': [77, 88, 99, 90, 91, 92, 99, 100], 'k2': [11, 22, 33, 44, 55, 66]}
  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值