Python列表解析式

列表解析式

列表解析式的语法:[返回值 for 元素 in 可迭代对象 if 条件],使用中括号[],内部是for循环,if条件语句可选,返回一个新的列表 。
列表解析式是一种语法糖,编译器会优化,不会因为简写而影响效率,反而因优化提高了效率。减少程序员工作量,减少出错。简化了代码,但可读性增强。
比如要生成一个列表,元素0~9,对每一个元素自增1后求平方返回新列表,下面看不用列表解析式和用列表解析式的代码。

#不用列表解析式
l1 = list(range(10))
l2 = []
for i in l1:
    l2.append((i+1)**2)
print(l2)

#用列表解析式
l2 = [(i+1)**2 for i in range(10)]
print(l2)
print(type(l2))

结果为:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
<class ‘list‘>

可以看到可读性更高,同时也减少了代码量。比如如果要获取10以内的偶数。

#不用列表解析
even = []
for i in range(10):
    if i%2==0:
        even.append(i)
print(even)

#用列表解析
[i for i in range(10) if i%2==0]

结果为:
[0, 2, 4, 6, 8]
[0, 2, 4, 6, 8]

有这样的赋值语句newlist = [print(i) for i in range(10)],请问newlist的元素打印出来是什么?

newlist = [print(i) for i in range(10)]
print(newlist)

结果为:
0
1
2
3
4
5
6
7
8
9
[None, None, None, None, None, None, None, None, None, None]

应该注意if条件后面不能在跟elif,比如获取20以内的偶数,如果数是3的倍数也打印,下面的代码是不行的。

[i for i in range(20) if i%2==0 elif i%3==0]

结果为:
  File "<ipython-input-110-8aea5f5e5abc>", line 1
    [i for i in range(20) if i%2==0 elif i%3==0]
                                       ^
SyntaxError: invalid syntax

列表解析式进阶

[expr for item in iterable if cond1 if cond2] 这等价于:

ret = []
for item in iterable:
  if cond1:
      if cond2:
        ret.append(expr)

比如20以内,既能被2整除又能被3整除的数。

[i for i in range(20) if i%2==0 and i%3==0]

结果为:
[0, 6, 12, 18]

[i for i in range(20) if i%2==0 if i%3==0] 

结果为:
[0, 6, 12, 18]

[expr for i in iterable1 for j in iterable2 ] 等价于:

ret = []
for i in iterable1:
  for j in iterable2:
    ret.append(expr)

相当于嵌套for循环。

[(x, y) for x in ‘abcde‘ for y in range(3)]

结果为:
[(‘a‘, 0),
 (‘a‘, 1),
 (‘a‘, 2),
 (‘b‘, 0),
 (‘b‘, 1),
 (‘b‘, 2),
 (‘c‘, 0),
 (‘c‘, 1),
 (‘c‘, 2),
 (‘d‘, 0),
 (‘d‘, 1),
 (‘d‘, 2),
 (‘e‘, 0),
 (‘e‘, 1),
 (‘e‘, 2)]

[[x, y] for x in ‘abcde‘ for y in range(3)]

结果为:
[[‘a‘, 0],
 [‘a‘, 1],
 [‘a‘, 2],
 [‘b‘, 0],
 [‘b‘, 1],
 [‘b‘, 2],
 [‘c‘, 0],
 [‘c‘, 1],
 [‘c‘, 2],
 [‘d‘, 0],
 [‘d‘, 1],
 [‘d‘, 2],
 [‘e‘, 0],
 [‘e‘, 1],
 [‘e‘, 2]]

[{x: y} for x in ‘abcde‘ for y in range(3)]

结果为:
[{‘a‘: 0},
 {‘a‘: 1},
 {‘a‘: 2},
 {‘b‘: 0},
 {‘b‘: 1},
 {‘b‘: 2},
 {‘c‘: 0},
 {‘c‘: 1},
 {‘c‘: 2},
 {‘d‘: 0},
 {‘d‘: 1},
 {‘d‘: 2},
 {‘e‘: 0},
 {‘e‘: 1},
 {‘e‘: 2}]
[(i,j) for i in range(7) if i>4 for j in range(20,25) if j>23]

[(i,j) for i in range(7) for j in range(20,25) if i>4 if j>23]

[(i,j) for i in range(7) for j in range(20,25) if i>4 and j>23]

结果都为:

[(5, 24), (6, 24)]

练习题:

  1. 返回1-10平方的列表
  2. 有一个列表lst = [1,4,9,16,2,5,10,15],生成一个新列表,要求新列表元素是lst相邻2项的和
  3. 打印九九乘法表
  4. "0001.abadicddws" 是ID格式,要求ID格式是以点号分割,左边是4位从1开始的整数,右边是10位随机小写英文字母。请依次生成前100个ID的列表 
#返回1-10平方的列表

[i**2 for i in range(1,11)]

结果为:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

#有一个列表lst = [1,4,9,16,2,5,10,15],生成一个新列表,要求新列表元素是lst相邻2项的和
lst = [1,4,9,16,2,5,10,15]
[lst[i]+lst[i+1] for i in range(len(lst)-1)]

结果为:
[5, 13, 25, 18, 7, 15, 25]

#打印九九乘法表
print("\n".join(["".join(["%s*%s=%-3s" %(x,y,y*x) for x in range(1,y+1)]) for y in range(1,10)]))

结果为:
1*1=1
1*2=2  2*2=4
1*3=3  2*3=6  3*3=9
1*4=4  2*4=8  3*4=12 4*4=16
1*5=5  2*5=10 3*5=15 4*5=20 5*5=25
1*6=6  2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7  2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8  2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9  2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 

[print("{}*{}={:<3}{}".format(j,i,i*j,"\n" if i==j else ""),end="") for i in range(1,10) for j in range(1,i+1)]

结果为:

1*1=1
1*2=2  2*2=4
1*3=3  2*3=6  3*3=9
1*4=4  2*4=8  3*4=12 4*4=16
1*5=5  2*5=10 3*5=15 4*5=20 5*5=25
1*6=6  2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7  2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8  2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9  2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
[None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None,
 None]
import random

["{:04}.{}".format(n,"".join([random.choice(bytes(range(97,123)).decode()) for _ in range(10)])) for n in range(1,101)]

import random
["{:04}.{}".format(i,"".join([chr(random.randint(97,122)) for j in range(10)])) for i in range(1,101)]

import string
["{:>04}.{}".format(i,"".join((random.choice(string.ascii_lowercase)) for _ in range(0,10))) for i in range(1,101)]

以上三种方法都能生成

原文地址:https://www.cnblogs.com/xpc51/p/11671665.html

时间: 2024-11-14 12:55:20

Python列表解析式的相关文章

轻松学会Python列表解析式(转载)

有时候,一个编程设计模式使用得十分普遍,甚至会逐步形成自己独特的语法.Python编程语言中的列表解析式(list comprehension)就是这类语法糖(syntactic sugar)的绝佳代表. Python中的列表解析式是个伟大的发明,但是要掌握好这个语法则有些难,因为它们并是用来解决全新的问题:只是为解决已有问题提供了新的语法. 接下来,我们一起来学习什么是列表解析式,以及如何掌握使用这种语法的时机. 什么是列表解析式? 列表解析式是将一个列表(实际上适用于任何可迭代对象(iter

Python - 列表解析式

列表解析--用来动态地创建列表 [expr for iter_var in iterable if cond_expr] 例子一: map(lambda x: x**2, range(6)) [0, 1, 4, 9, 16, 25] [x**2 for x in range(6)] [0, 1, 4, 9, 16, 25] 列表解析式可以取代内建的map()函数以及lambda,而且++效率更高++. 例子二: seq = [11, 10, 9, 8, 7, 6] filter(lambda x

Python - 列表解析式/生成器表达式

列表解析式: [expr for iter_var in iterable if cond_expr] 生成器表达式: (expr for iter_var in iterable if cond_expr) 二者的区别: -列表解析式需要生成所有的数据: -生成器解析式不是真正创建列表,而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目yield出来.生成器表达式使用了延迟计算,在使用内存上更有效.

python列表解析式与生成式表达式

一.列表解析式 语法: [返回值 for 元素 in 可迭代对象 if 条件] 使用中括号[],内部是for循环,if条件语句可选 返回一个新的列表 列表解析式是一种语法糖,编译器会优化,不会因为简写而影响效率,反而因优化提高了效率,减少程序员工作量,减少出错 ,简化了代码,但可读性增强 [expr for item in iterable if cond1 if cond2] 与[expr for item in iterable if cond1 and cond2] 等价 例:有一个列表l

列表解析式 -- Python

列表解析的语法:[expr for iter_var in iterable], 它迭代iterable对象的所有条目.其中的expr应用于序列的每个成员,最后的结果值是该表达式产生的列表,迭代变量并不需要是表达式的一部分. #!usr/bin/env python #coding:utf-8 ''' 需求:找出出1-10内所有的奇数,并将奇数求平方 ''' print(tuple((i for i in range(11) if i%2))) print(list((i*i for i in

python列表和QVariant

pyqt中,要给QAbstractTableModel的setData函数传递一个list参数: [20,'00:00:19'] 涉及到QVariant和list的转换. 可以使用QVariant类中的toPyObject是转换. 环境是:Python 2.7.6 pyqt4 4.8.6 有文章说是,toPyObject只能转换字符串,而且只能转换字典. 测试一下,支持数字,支持字典和列表. #coding:utf-8 from PyQt4.QtCore import QVariant a={2

Python列表的增删改查排

Python列表的增删改查排 一.列表的样子: a = ['q' , 'w' , 'e ', 'r','t'] a为列表名,[ ]为列表内容,' '为列表内的元素,'q'为a[0] 二.查(也称切片): print ( a[0] )          #取出列表中第一个元素 即:q print ( a[1:] )        #从第二个元素开始取到最后 即:['w', 'e','r', 't'] print ( a[1:3] )        #取出从第二个开始到第三个元素 即:['w','e

python列表和元组的方法和属性

python序列的共性 python序列包括列表和元组,序列都有索引,第一个元素索引为0,序列都可以进行索引.加.乘.切片.检查成员. python列表 列表是最常用的数据类型之一,通过[,,,]建立,可以给变量赋值空列表[].列表的数据项可以是不同类型的,可以嵌套. 列表的索引和字符串操作一样,同样可以截取例如a[1:2] / a[1:] / a[:3] 列表的更新: 1.修改:通过索引直接赋值来修改列表中的值. 2.新增:通过list.append(),在末尾处添加元素. 3.删除: A.通

[转载] Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结

创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_start = sample_list[0] end_value = sample_list[-1] 删除列表的第一个值 del sample_list[0] 在列表中插入一个值 sample_list[0:0] = ['sample value'] 得到列表的长度 list_length = len(sa