python5:序列之list

list是可变序列,通常用于存储同类型的元素。下面介绍list的专用方法,并且介绍几种使用list的数据结构。

构造list

list可以使用下面几种方法构造:
    1)用一对方括号表示一个空list:[];
    2)用方括号,元素使用逗号分隔:[a],[a,b,c];
    3)用表达式:[x for x in iterable];
    4)使用list函数:list()或者list(iterable)。
这里list函数用于构造一个list。如果参数为空,则创建一个空的list。iterable可以是一个序列、支持迭代的容器或者迭代对象,如果iterable已经是一个list,则返回该list的拷贝,类似于iterable[:]。
下面是具体的例子:

>>> list('abc')
['a', 'b', 'c']
>>> list((1,2,3))
[1, 2, 3]

除了上面介绍的方法,还有一些方法也产生list,例如sorted() 方法。

list的方法

list实现了所有序列的公共方法和可变序列的方法,另外,list还提供了排序方法。

sort

sort用于对list进行原位排序,即会改变原来的list,让其中的元素按一定的顺序排列,例如:

>>> s = [7,2,4,1,6,9,8]
>>> s.sort()
>>> s
[1, 2, 4, 6, 7, 8, 9]

sort不会返回值,如果你不想改变原list,则需要先将数据进行一次拷贝:

>>> s = [7,2,4,1,6,9,8]
>>> other = s[:]
>>> other.sort()
>>> s
[7, 2, 4, 1, 6, 9, 8]
>>> other
[1, 2, 4, 6, 7, 8, 9]

或者你可以使用sorted函数,它返回新的原list的排序后的list:

>>> s = [7,2,4,1,6,9,8]
>>> other = sorted(s)
>>> s
[7, 2, 4, 1, 6, 9, 8]
>>> other
[1, 2, 4, 6, 7, 8, 9]

高级排序

sort默认按升序排列元素,如果按照特定的方式排序,则需要指定参数,sort支持的参数如下:
    sort(*,key=None,reverse=None)
key指定排序的key,reverse指定执行是否逆序。看下面的例子:

>>> x = ['kjkeikkkll', '34r5fd','1qw','12333333333333333','kiooo']
>>> x.sort(key=len)
>>> x
['1qw', 'kiooo', '34r5fd', 'kjkeikkkll', '12333333333333333']
>>> s = [7,2,4,1,6,9,8]
>>> s.sort(reverse=True)
>>> s
[9, 8, 7, 6, 4, 2, 1]

在2.x的python版本还可以指定cmp,表示比较函数,不过使用key也能代替cmp,如定义一个key函数:

def toValue(x):
    return x['age']

然后在排序中使用该函数:

persons=[{'name':'ZhangSan','age':16},{'name':'LiSi','age':12}]
persons.sort(key=toValue)
print(persons)

也可以使用lambda表达式来做:

>>> persons=[{'name':'ZhangSan','age':16},{'name':'LiSi','age':12}]
>>> persons.sort(key=lambda a : a['age'])
>>> persons
[{'age': 12, 'name': 'LiSi'}, {'age': 16, 'name': 'ZhangSan'}]

list推导

假定我们需要构造一个list,如下:

>>> s = []
>>> for x in range(10):
        s.append(x**2)
>>> s
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

我们能用更简洁的方式来做这个事情:

>>>list(map(lambda x:x**2,range(10)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

map(function,iterable,...)的作用是生成一个迭代器,使用function到每一个条目。
或者,也可以使用下面的方式:

>>> [x**2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

这样更简洁,可读性也更好。也可以用在多元的列表上:

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

或者为单个元素使用多个for:

>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

嵌套list推导

假定我们存在下面的一个3*4的矩阵:

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

可以使用该矩阵生成一个嵌套list:

>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

也就是取matrix中每行的第i个元素组成一个新的list,并将该list作为嵌套list的第i个元素。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值