首页 > 其他分享 >【7.0】列表字典推导式

【7.0】列表字典推导式

时间:2023-12-05 14:57:58浏览次数:35  
标签:推导 生成式 list 列表 print 7.0 test 字典

【一】语法

  • 列表推导式可以利用列表,元组,字典,集合等数据类型,快速的生成一个特定需要的列表。

  • 语法格式如下

    [表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]]
    

【二】列表推导式

【1】为什么要用列表推导式?

  • 列表推导式为我们提供了一种从序列创建列表的简单途径,它书写简单,执行效率比循环高。
  • 下面我们通过代码直观的感受一下列表推导式的魅力。

(1)直接从序列中构建列表

number_list = []
for i in range(5):
    number_list.append(i)

print(number_list) # [0, 1, 2, 3, 4]

(2)使用列表推导式

number_list = [i for i in range(5)]
print(number_list)  # [0, 1, 2, 3, 4]

【2】列表推导式的应用

(1)新生成列表的每个元素都可以是任意的表达式或对象

test = [1, 2, 3]

print([i * i for i in test])
# [1,4,9]

print([[i, i + 2] for i in test])
# [[1,3],[2,4],[3,5]]

(2)让每个元素执行相同的操作

# 原始列表 : 每个元素都有空格
some_animals = [' dog', 'cat  ', ' sheep ']

# 列表生成式: 新的列表,每个元素都去除掉了空格
some_animals_new = [i.strip() for i in some_animals]
print(some_animals_new)
# ['dog','cat','sheep']

(3)加入嵌套循环

test_1 = [1, 2, 3]
test_2 = [4, 5, 6]

# 列表生成式 : 遍历两个列表并取出每一个列表的元素 做乘法运算
list_one = [x * y for x in test_1 for y in test_2]
print(list_one)
# [4,5,6,8,10,12,12,15,18]

# 列表生成式 : 遍历两个列表并取出每一个列表的元素 做新列表的生成
list_two = [[x, x + y] for x in test_1 for y in test_2]
print(list_two)
# [[1, 5], [1, 6], [1, 7], [2, 6], [2, 7], [2, 8], [3, 7], [3, 8], [3, 9]]

###  注意通过这两个print体会谁是内层循环,谁是外层循环

# 列表生成式 : 遍历两个列表并取出每一个列表对应索引的元素 做乘法运算
list_three = [test_1[i] * test_2[i] for i in range(len(test_1))]
print(list_three)
# [4, 10, 18]

# 列表生成式 : 遍历两个列表并取出每一个列表对应索引的元素 做乘法运算
list_four = [x * y for x, y in zip(test_1, test_2)]
print(list_four)
# [4, 10, 18]

(4)实现行列转换

test = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

list_new = [[row[i] for row in test] for i in range(len(test[0]))]

print(list_new)
# [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

(5)加入判断条件,组成过滤器

  • 从一个给定的列表中选出偶数组成一个新的列表
test = [1, 2, 3, 4, 5, 6]
list_one = [x for x in test if x % 2 == 0]
print(list_one)
# [2, 4, 6]

list_two = list(filter(lambda x: x % 2 == 0, test))
print(list_two)
# [2, 4, 6]
  • filter是Python中的一个内嵌函数,它有两个参数,
    • 其中第一个参数是一个函数
    • 第二个参数是一个迭代器
    • 返回值是布尔类型
  • 它的作用是将迭代器中的每一个元素都用第一个函数进行判断
    • 为真则保留
    • 反之则去除
    • 从而也形成了过滤的作用。
  • 如果此处对lambda表达式有疑惑,不妨可以看看有关函数中对lambda表达式的介绍。

(6)判断列表中有几个对称数

test = [1221, 1234, 12321, 14441, 15672]

list_one = sum([num == num[::-1] for num in map(str, test)])
print(list_one)
# 3

list_two = len([num for num in map(str, test) if num == num[::-1]])
print(list_two)
# 3

【2】列表生成式

  • 只需要将列表推导式中的中括号改成小括号就变成了生成式。

(1)与推导式的区别

  • 列表推导式一次性返回所有的元素,生成式每次只会返回一个元素
  • 当生成的元素数量非常多时,生成式占用的空间非常小,而推导式则会占用大量的空间
  • 推导式的执行效率高,所以推荐在数据量小的时候使用

(2)示例

test = [1, 2, 3]

list_one = (i * i for i in test)
print(list_one)
# <generator object <genexpr> at 0x0000026B4E6C0D60>

list_two = list(i * i for i in test)
print(list_two)
# [1, 4, 9]

list_three = ([i, i + 2] for i in test)
print(list_three)
# <generator object <genexpr> at 0x0000026B4E6C09E0>
  • 从以上代码我们可以看出生成式的直接返回结果时一个生成器。

  • 素数判断

import math


def is_prime(n):
    if n == 2: return True
    if n < 2 or n % 2 == 0: return False
    return all(n % i for i in range(3, int(math.sqrt(n) + 1), 2))


print(is_prime(23))
# True

【3】字典推导式

  • 有了列表推导式的概念,字典推导式学起来就非常简单了,语法格式如下:
{键:值 for 迭代变量 in 可迭代对象 [if 条件表达式]}
  • 案例
my_dict = {key: value for key in range(3) for value in range(2)}
print(my_dict)
# {0: 1, 1: 1, 2: 1}
  • 最常见的哪里还是下述的代码,遍历一个具有键值关系的可迭代对象。
my_tuple_list = [('name', '橡皮擦'), ('age', 18), ('class', 'no1'), ('like', 'python')]
my_dict = {key: value for key, value in my_tuple_list}
print(my_dict)
# {'name': '橡皮擦', 'age': 18, 'class': 'no1', 'like': 'python'}

【4】元祖推导式和集合推导式

  • 其实你应该能猜到,在 Python 中是具备这两种推导式的,而且语法相信你已经掌握了。不过语法虽然差不多
  • 但是元组推导式运行结果却不同,具体如下。
my_tuple = (i for i in range(10))
print(my_tuple)
# <generator object <genexpr> at 0x000001D17C9B7DD0>
  • 使用元组推导式生成的结果并不是一个元组,而是一个生成器对象,需要特别注意下

  • 这种写法在有的地方会把它叫做生成器语法,不叫做元组推导式。

  • 集合推导式也有一个需要注意的地方,先看代码:

    my_set = {value for value in 'HelloWorld'}
    print(my_set)
    # {'r', 'o', 'W', 'H', 'l', 'd', 'e'}
    
    • 因为集合是无序且不重复的,所以会自动去掉重复的元素,并且每次运行显示的顺序不一样,使用的时候很容易晕掉。

标签:推导,生成式,list,列表,print,7.0,test,字典
From: https://www.cnblogs.com/dream-ze/p/17877177.html

相关文章

  • 可持久化Trie树(字典树)
    举例子:插入cat:插入cup:插入soup:插入cut:可持久化数据结构的重要问题就是解决区间的查询问题:例题,洛谷4735: M个操作,操作1:添加操作,添加一个树x,序列长度+1操作2:询问操作,找到一个位置p,满足l<=p<=r,使得a[p]^a[p+1]^...^a[N]^x最大,输出最大值 分析:令S[k]=a......
  • 自动类型推导
    文章参考:爱编程的大丙(subingwen.cn)1.auto在C++11之前,auto和static相对应用于表示变量是自动存储的,但是非static局部变量默认都是自动存储的,auto因此显得额外鸡肋。C++11中对auto进行了扩展,使他能够自动推导变量的实际类型。1.1推导规则C++中auto并不是一种数据类型,而是......
  • 字典树模板
    #include<bits/stdc++.h>usingnamespacestd;structtrie{intn;vector<array<int,26>>trans;vector<int>cnt;trie():n(0){new_node();}intnew_node(){trans.push_back({});trans.back()......
  • 实体类(多层嵌套)生成FastReport需要的frd字典文件
    #region根据模型生成FastReport需要的Frd字典文件///<summary>///生成frd文件内容///</summary>privatestaticStringBuilderstringTouBu=newStringBuilder();///<summary>///根据模型生成FastReport需要的F......
  • python基础-字典
    1、字典定义字典是一种可变的容器,可以存储任意类型的数据字典中的每个数据都是用"键"(key)进行索引,而不像序列可以用下标进行索引【集合可以用下标进行搜索】字典中的数据没有先后关系,字典的存储是无序的【集合set存储也是无序的】字典的表示方式是以{}括起来,以冒号(......
  • 一键导出数据库中表结构定义(数据字典)的工具
    导出数据库中标的定义,即所谓的数据字典一、新建maven工程中加入依赖在maven工程的pom.xml中添加依赖<dependency><groupId>cn.smallbun.screw</groupId><artifactId>screw-core</artifactId><version>1.0.5</version></dependency>......
  • 使用样式表和 rcParams字典自定义 Matplotlib属性和样式
    3种方式自定义Matplotlib的属性和样式1.运行时通过rcParams字典动态设置2.使用样式表3. 更改matplotlibrc文件在运行时设置rcParams优先于样式表、样式工作表优先于文件matplotlibrc即1>2>31. 运行时通过rcParams字典动态设置通过字典matplotlib.rcParams,动态修改......
  • 华为平板M3 BTV-DL09 亲测成功升级官方EMUI5.0-安卓7.0刷机包SD卡刷包
    调包离山之计,完成的可用组合包。试装了无数的TWRP,只有一个版本的能用。可用twrp_BTV-DL09_lte.img、即是TWRP3.0.2版,这个TWRP可以刷入降级包。但试了很多包都刷不上系统,当时以为要变砖了。还好没放弃。主要是包的目录结构的问题。还有很多卡刷包没有讲清怎么用。后面刷......
  • 手把手教学Zabbix7.0+麒麟操作系统,兼容认证
    感谢本文作者李根,Zabbix高级认证工程师(ZCP)。Zabbix6.0在麒麟操作系统上进行部署测试成功,所以此刻想验证Zabbix7.0的兼容性。结果证明是兼容的!主要步骤见下文。Zabbix7.0LTS(长期支持版本)计划于2024年第一季度发布,但其内测版本已于近日在官方更新。信创托底Zabbix提供了百......
  • 多线程连接池报错报警告[connectionpool.py:305 ] [WARNING] Connection pool is full
    第一种方法:按照建议WebDriverWait帮助解决了问题 fromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.common.byimportByfromselenium.common.exceptionsimportT......