Python元组、列表--笔记
《Python3 程序开发指南》
序列包括元组和列表,首先,我们介绍元组。
元组--tuple
元组为有序的序列,元组和字符串一样也是固定的,不能替换或删除其中的任意数据项。如果需要修改应使用列表而非元组,若修改元组,则需要通过使用list()转换函数将其转换为列表再修改。一元组中,逗号是必须的
元组方法:
t.count(x):返回对象x在元组中出现的次数
t.index(x):返回对象在元组t中出现的最左边位置,若t中不包含x,则产生ValueError异常。
操作符:
+ :连接
* :赋值
[] :分片
in,not in:测试成员关系
命名的元组:
可以根据名称引用元组中的项,使我们可创建数据项的聚集。collections模块提供了namedtuple()函数,该函数用于创建自定义的元组数据类型。collections.namedtuple()第一个参数为要创建的自定义元组数据类型的名称,第二个参数为字符串,包含使用空格分隔的名称,每个名称代表该数据类型的一项。该函数返回一个自定义的类,可用于创建命名的元组。
>>> import collections >>> Sale = collections.namedtuple("Sale","productid customerid date quality price") >>> Sale <class '__main__.Sale'> >>> sales = [] >>> sales.append(Sale(432,924,"2011-09-23",3,7.8)) >>> sales.append(Sale(344,956,"2011-09-24",1,5.7)) >>> total = 0 >>> for sale in sales: total += sale.quality * sale.price >>> print "Total ${0:.2f}".format(total) Total $29.10
下面介绍几个例子,方便理解:
>>> Aircraft = collections.namedtuple("Aircraft","manufacturer model seating") >>> Seating = collections.namedtuple("Seating","min max") >>> aircraft = Aircraft("Airbus","A320-200",Seating(100,220)) >>> aircraft.seating.max 220 通过命名的元组属性来访问元组中的项 >>> print "{0} {1}".format(aircraft.manufacturer,aircraft.model) Airbus A320-200 使用一个单独的位置参数,并在格式化字符串中使用命名的元组属性名作为字段名 >>> print "{0.manufacturer} {0.model}".format(aircraft) Airbus A320-200 namedtuple._asdict()方法返回的是键值对的映射,其中每个键都是元组元素的名称,值则是对应的值,使用映射拆分将映射转换为str.format()方法的键-值参数 >>> print "{manufacturer} {model}".format(**aircraft._asdict()) Airbus A320-200
列表--list
列表是可变的,可以对列表中的项进行删除、替换。列表中所有数据项实际为对象引用,与元组一样,列表也可存放任意数据类型的数据项,可使用标准的比较操作符。
列表方法
L.append(x) | 将单个数据项x追加到列表L的尾部 |
L.count(x) | 返回数据项x在L中出现的次数 |
L.extend(m) L += m |
将列表m的项追加到L的结尾处,操作符 += 完成相同的功能 |
L.index(x,start,end) | 返回数据项x在列表L中(或L的分片中)最左边出现的索引位置,否则产生ValueError异常 |
L.insert(i,x) | 在索引位置 i 处将数据项x插入列表L |
L.pop() | 返回并移除L最右边的数据项 |
L.pop(i) | 返回并移除L中index为i的数据项 |
L.remove(x) | 从L中移除最左边出现的数据项x,如果找不到x就产生ValueError异常 |
L.reverse() | 对列表L进行翻反转 |
L.sort(...) | 对列表L进行排序 |
序列拆分:尽管可以使用分片存取列表中的数据项,但在有些情况下,需要一次提取两个或更多个数据项,则可使用序列拆分,即*。任意可迭代的(列表、元组等)数据类型都可以使用序列拆分。
>>> first,*rest=[9,2,-4,8,7] >>> first,rest (9,[2,-4,8,7]) >>> first,*mid,last="a b c d e".split() >>> first,mid,last ('a',['b','c','d'],'e') >>> *dir,exe = "/usr/local/bin/gvim".split("/") >>> dir,exe (['','usr','local','bin'],'gvim')
带星号的参数
*rest称为带星号的表达式。下面有一个函数:
定义一个函数 >>> def product(a,b,c): return a*b*c 普通调用 >>> product(2,3,5) 30 使用带星号的参数,列表L的3个数据项被*拆分 >>> L=[3,4,5] >>> product(*L) 60 第一个参数为常规传递,另两个参数则通过对列表L的数据分片拆分得到 >>> product(2,*L[1:]) 40
操作符*区分:---拆分和多复制
(1)当*出现在复制操作的左边时,用作拆分
(2)出现在其他位置时:若用作单值操作符,则代表拆分操作符;若用作二进制操作符,则代表多复制操作符
列表内涵
列表内涵是一个表达式,也是一个循环,作用:为列表生成数据项,并且可以使用条件过滤掉不需要的数据项。形式如下:
[item for item in iterable]
实现列表内涵的常用语法格式:
[expression for item in iterable]
[expression for item in iterable if condition]
举例如下:
>>> leaps = [y for y in range(1900,1940)] >>> leaps [1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939] 也可以用range实现 >>> leaps = list(range(1900,1940)) >>> leaps [1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939] 求规定时间内的闰年 >>> leaps = [y for y in range(1900,1940) if (y%4==0 and y%100 != 0) or (y%400==0)] >>> leaps [1904, 1908, 1912, 1916, 1920, 1924, 1928, 1932, 1936]
可嵌套:
例如对给定的性别(f,m)尺寸(s,m,l,x)、颜色(b,g,w)给出所有的组合,但排除肥胖女士
>>> codes=[s+z+c for s in "mf" for z in 'smlx' for c in "bgw" if not (s=="f" and z =="x")] >>> codes ['msb', 'msg', 'msw', 'mmb', 'mmg', 'mmw', 'mlb', 'mlg', 'mlw', 'mxb', 'mxg', 'mxw', 'fsb', 'fsg', 'fsw', 'fmb', 'fmg', 'fmw', 'flb', 'flg', 'flw']
如果生成的列表非常大,那么使用生成器会比列表内涵更高效