,文章

笛卡儿积/列表推导式/生成器表达式/元组/拆包

列表推导式

  1. 列表推导的作用只有一个:生成列表
  2. 用列表推导可以生成两个或以上的可迭代类型的笛卡儿积。
  3. python会忽略[]/()/{}中的换行,你可以省略不好看的换行符'\'
colors = ['黑色', '白色']
sizes = ['S', 'M', 'L']

tshirts = [(color,size) for color in colors
                            for size in sizes]
print(tshirts)
---
[('黑色', 'S'), ('黑色', 'M'), ('黑色', 'L'), ('白色', 'S'), ('白色', 'M'), ('白色', 'L')]
  1. 如果你希望将排序的规则修改为按size排序,那么只需要更改从句的顺序
tshirts = [(color,size) for size in sizes
                            for color in colors]
print(tshirts)
[('黑色', 'S'), ('白色', 'S'), ('黑色', 'M'), ('白色', 'M'), ('黑色', 'L'), ('白色', 'L')]

生成器表达式

  1. 生成器表达式的语法与列表推导式差不多,只不过把方括号换成了圆括号
  2. 生成器表达式逐个产出元素,不会一次性产出含有x个元素的列表,如果要计算两个各有1000个元素的列表的笛卡儿积,生成器表达式就可以省却运行for循环的开销,即100万个元素的列表
import array
sizes = [76, 77, 80, 82, 85, 87]
r = tuple(size for size in sizes)
print(r)
r = array.array('I',(size for size in sizes))
print(r)
---
(76, 77, 80, 82, 85, 87)
array('I', [76, 77, 80, 82, 85, 87])

colors = ['黑色', '白色']
sizes = ['S', 'M', 'L']

for tshirt in ('%s %s'% (c,s) for c in colors for s in sizes):
    print(tshirt)
---
黑色 S
黑色 M
黑色 L
白色 S
白色 M
白色 L

元组不仅仅是不可变列表

在很多python入门教程里面把元组成为不可变列表.然而这并没有完全概括元组的特点,它还可以用于没有字段名的记录,鉴于后者经常被忽略,我们先来看看元组作为记录的功能.

#洛杉矶国际机场经纬度
lax = (33.9425, -118.408056)
#东京市信息:城市名,年份,人口(百万),人口变化(百分比),面积(平方千米)
city, year, pop, chg, area = ('Tokoyo', 2003, 32450, 0.66, 8014)
#一个元组列表:城市代码和护照编码
ids = [('USA','31195855'),('BRA','CE342567'),('ESP',
                                              'XDA205856')]
#在迭代过程中,passport被绑定到每个元组上而%运算符能够被匹配到对应的元组里的元素上
for passport in sorted(ids):
    print('%s/%s' % passport)

BRA/CE342567
ESP/XDA205856
USA/31195855
#for循环可以分别提取元组里面的元素,也叫做拆包(unpacking).因为除了第二个元素对我们没什么作用,暂时不需要,所以用占位符"_"
for country, _ in ids:
    print(country)
---
USA
BRA
ESP
原文来自:笛卡儿积/列表推导式/生成器表达式/元组/拆包,尊重自己,尊重每一个人;转发请注明来源!
0 0

发表评论