python入门(四)-- 列表、元组、字典具体操作

1、序列(列表、元组和字符串)的方法

Python包含以下函数:

序号函数
1len(seq):返回序列中的元素个数
2max(seq):返回序列元素最大值
3min(seq):返回序列元素最小值
4sum(seq):返回序列值的和
5sort(seq):对序列进行排序,返回一个list
5list(seq):将序列转换为列表
6tuple(seq):将序列转换为列表
7str(obj):将任意对象转换为字符串

注意:

  • sum、max和min要求序列中的值必须是同一个类型,不然无法比较或者求和。

例如:

>>> string = "asdfqer12314"
>>> sorted(string)
['1', '1', '2', '3', '4', 'a', 'd', 'e', 'f', 'q', 'r', 's']
>>> max(string)
's'
>>> min(string)
'1'
>>> string
'asdfqer12314'
>>> list = sorted(string)
>>> max(list)
's'
>>> min(list)
'1'
>>> list = [1,1,2,3,4,'a','d']
>>> max(list)
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    max(list)
TypeError: unorderable types: str() > int()

注意:

  • 和其他语言中不同,python中没有和数字类型可以互转的char类型,所以单个字符’a’实际上也是字符串,无法直接和数字进行比较。

1.1、序列的filter函数

filter函数的定义是:filter(function or None, iterable) –> filter object。

可以通过输入的函数来对序列进行过滤,并返回一个filter object。注意:

  • 输入None的话,会自动将0和False过滤掉
In [16]: list(filter(None,[1,0,False,True]))
Out[16]: [1, True]
  • 可以输入函数来指定过滤的规则(和Java8中的Stream类似的功能),例如:
In [18]: list(filter(lambda x:(x&0x01)==1,[1,2,3,4,5,6,7]))
Out[18]: [1, 3, 5, 7]

1.2、序列的map函数

map函数的定义是: map(func, *iterables) –> map object。

map函数可以对输入的序列中的每一个函数,进行一次func操作,并返回一个map object。(同样和Java中Stream的map类似)。例如:

In [21]: list(map(lambda x: x+1,[1,2,3,4,5,6]))
Out[21]: [2, 3, 4, 5, 6, 7]

2、列表

2.1、有关列表的所有方法和函数

List包含以下内置函数:

序号方法
1list.append(obj):在列表末尾添加新的对象
2list.count(obj):统计某个元素在列表中出现的次数
3list.extend(seq):在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4list.index(obj):从列表中找出某个值第一个匹配项的索引位置
5list.insert(index, obj):将对象插入列表的指定位置之前,不会覆盖原位置的元素
6list.pop(obj=list[-1]):移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7list.remove(obj):移除列表中某个值的第一个匹配项
8list.reverse():反向列表中元素
9list.sort([func]):对原列表进行原址排序
10list.clear():清空列表
11list.copy():返回列表的一个“浅拷贝”,等同于list[:]

例如:

2.1.1、向列表中插入元素

In [1]: animals = ['cai','dog','snake','lion']

In [2]: animals.append('pig')

In [3]: animals
Out[3]: ['cai', 'dog', 'snake', 'lion', 'pig']

In [4]: animals.append('bird','cow')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-57b332645244> in <module>()
----> 1 animals.append('bird','cow')

TypeError: append() takes exactly one argument (2 given)

In [5]: animals.extend('bird','cow')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-d37215d6ed56> in <module>()
----> 1 animals.extend('bird','cow')

TypeError: extend() takes exactly one argument (2 given)

In [6]: animals.extend(['bird','cow'])

In [7]: animals
Out[7]: ['cai', 'dog', 'snake', 'lion', 'pig', 'bird', 'cow']

In [8]: animals.insert(0,'dragon')

In [9]: animals
Out[9]: ['dragon', 'cai', 'dog', 'snake', 'lion', 'pig', 'bird', 'cow']

注意:

  • append一次只能添加一个元素
  • 一次添加多个元素需要使用extend
  • 注意extend接受一个数组,而不能以多个元素的形式输入,否则报错
  • insert插入,不替换原位置的元素

2.1.2、删除列表元素

In [9]: animals
Out[9]: ['dragon', 'cai', 'dog', 'snake', 'lion', 'pig', 'bird', 'cow']

In [10]: animals.remove('cai')

In [11]: animals
Out[11]: ['dragon', 'dog', 'snake', 'lion', 'pig', 'bird', 'cow']

In [12]: del animals[0]

In [13]: animals
Out[13]: ['dog', 'snake', 'lion', 'pig', 'bird', 'cow']

In [14]: animals.pop()
Out[14]: 'cow'

In [15]: animals
Out[15]: ['dog', 'snake', 'lion', 'pig', 'bird']

In [16]: animals.pop(1)
Out[16]: 'snake'

In [17]: animals.remove(0)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-98c2ad3daa0d> in <module>()
----> 1 animals.remove(0)

ValueError: list.remove(x): x not in list

注意:

  • remove返回None,只接收元素,不接收下标
  • pop不接收元素,接收下标
  • 也可以用del指定删除元素

2.1.3、列表的排序

Python可以通过list.sort()和sorted(list)进行排序。差别是:

  • list.sort()对数组进行原址排序,返回None
  • sorted(list)数组本身不变,返回排序好的数组的副本
list = [1,8,3,6,7,9]
# 返回[1, 3, 6, 7, 8, 9]
print(sorted(list))
# 返回[1, 8, 3, 6, 7, 9]
print(list)
# 返回None
print(list.sort())
print(list)
# 还可以指定进行逆序排序
print(list.sort(reverse=True))

2.1.4、其他函数

In [25]: animals
Out[25]: ['dog', 'lion', 'pig', 'bird']

In [26]: animals.index('lion')
Out[26]: 1

In [27]: animals.append('dragon')

In [28]: animals.append('dragon')

In [29]: animals.count('dragon')
Out[29]: 2

In [30]: animals
Out[30]: ['dog', 'lion', 'pig', 'bird', 'dragon', 'dragon']

In [31]: animals.reverse()

In [32]: animals
Out[32]: ['dragon', 'dragon', 'bird', 'pig', 'lion', 'dog']

2.2、 把列表当做“栈”使用

“栈”是一个“后进先出”的数据结构,用append()和pop()可以轻松实现栈的操作:

  • 压栈:append()
  • 弹栈:pop()

和Java中的LinkedList等结构不同,Java中的实现是在列表的“头”存取,而python是在列表的“尾”存取,但是这并不重要,“栈”结构重要的是在“同一端存取”。

2.3、“队列”

“队列”是一个“先进先出”的数据结构。

和“栈”的情况不同,队列“不在同一端存取”。python中的列表类似于Java中的ArrayList,在头部删除、添加需要移动所有元素,效率低下。

固一般不用列表实现队列,而使用专门的类似于Java中LinkedList的类:collections.deque(双向链表):

from collections import deque
queue = deque([1, 2, 3])
queue.append(4)
print(list(queue))
pop = queue.pop()
print(pop)
popleft = queue.popleft()
print(popleft)
  • 入队:append()
  • 出队:popleft()

栈同样可以用deque实现,方法和list的相同。

2.4、列表推导式

列表推导式由一个包含一个表达式的括号组成,表达式后面跟随一个或多个for或者if语句(for语句和if语句按顺序进行)。

# 使用lambda表达式快速创建list
squares = list(map(lambda x: x**2, range(10)))
print(squares)
# 使用列表推导式快速创建list
squares = [x**2 for x in range(10)]
print(squares)
# 带if的列表推导式
squares = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
print(squares)
# 上面的列表推导式等同于
squares1 = []
for x in [1, 2, 3]:
    for y in [3, 1, 4]:
        if x != y:
            squares1.append((x,y))
print(squares1)
# 还可以有更复杂的表达式
from math import pi
squares2 = [str(round(pi, i)) for i in range(1, 6)]
print(squares2)

除了这些“简单”的列表以外,还可以用嵌套的列表推导式,进行更复杂的操作:

# 矩阵
matrix = [
            [1, 2, 3, 4],
            [5, 6, 7, 8],
            [9, 10, 11, 12]
        ]
print(matrix)

# 交换行列
tMatrix = [[row[i] for row in matrix] for i in range(4)]
print(tMatrix)

# 交换行列还可以通过拆分列表实现,*代表拆分,zip按顺序取每个子列表的同位置的元素
print(list(zip(*matrix)))

嵌套的多个for或者if语句,按嵌套的内外关系,外层的先进行。

2.5、序列的相互比较

序列对象可以与相同类型的其他对象比较。序列的相互比较和字符串的相互比较类似,由按顺序第一个不同的元素的”大小“来决定两个序列的大小

需要注意的是,元素的比较只比较”值“。

例如:

In [19]: list1 = [123]

In [20]: list2 = [234]

In [21]: list1 > list2
Out[21]: False

In [22]: list1 = [123,456]

In [23]: list2 = [234,123]

In [24]: list1 > list2
Out[24]: False

2.6、序列的拆分

序列(列表、元组和字符串)都可以进行如下形式的快速拆分操作:

# 声明元组
t = 12345, 54321, 'hello!'
# 拆分元组,变量数需要和元组的元素个数相等
x, y, z = t

3、集合

集合的操作(并集、交集、差集、对称差集):

# 构建元组
t = {"q","w","e","r"}
# 还可以用和列表推导式类似的方法构建
a = {x for x in "asdfqewrgq" if x not in "abc"}
print(a)

# 并集
print(t | a)
# 交集
print(t & a)
# 差集(注意,a-t和t-a不同)
print(a - t)
# 对称差集(不同时在t和a中的元素)
print(t ^ a)

4、字典

字典以关键字为索引,关键字可以是任意不可变类型。需要注意的是:

  • 如果元组只包含字符串和数字或者其他不可变类型,则它可以作为关键字,如果包含任何可变类型,则不能作为关键字

字典同样可以通过推导式创建:

# 使用推导式创建字典
dict1 = {x: x ** 2 for x in (2, 5, 6)}
print(dict1)

除此之外还可以通过元组创建:

dict1 = dict(((1,'cai'),(2,'li')))
print(dict1)

4.1、fromkeys()函数

fromkeys函数接收元组,创建指定key和值的dict。例如:

In [3]: dict1 = dict.fromkeys((1,2,3,4,5))

In [4]: dict1
Out[4]: {1: None, 2: None, 3: None, 4: None, 5: None}

In [5]: dict1 = dict.fromkeys((1,2,3,4,5),'Number')

In [6]: dict1
Out[6]: {1: 'Number', 2: 'Number', 3: 'Number', 4: 'Number', 5: 'Number'}

In [7]: dict1 = dict.fromkeys((1,2,3,4,5),('n1','n2','n3','n4','n5'))

In [8]: dict1
Out[8]:
{1: ('n1', 'n2', 'n3', 'n4', 'n5'),
 2: ('n1', 'n2', 'n3', 'n4', 'n5'),
 3: ('n1', 'n2', 'n3', 'n4', 'n5'),
 4: ('n1', 'n2', 'n3', 'n4', 'n5'),
 5: ('n1', 'n2', 'n3', 'n4', 'n5')}

In [12]: dict1 = dict.fromkeys(range(3))

In [13]: dict1
Out[13]: {0: None, 1: None, 2: None}

注意:

  • 如果不指定值,会自动填充None
  • 如果指定了值,所有的key都会被填充相同的值
  • 除了元组以外,也可以接收range

4.2、setdefault函数 

许多时候我们需要往字典中的元素添加数据,我们首先要判断这个元素是否存在,不存在则创建一个默认值。如果在循环里执行这个操作,每次迭代都需要判断一次,降低程序性能。

我们可以使用 dict.setdefault(key, default) 更有效率的完成这个事情。

>>> data = {}
>>> data.setdefault('names', []).append('Ruby')
>>> data
{'names': ['Ruby']}
>>> data.setdefault('names', []).append('Python')
>>> data
{'names': ['Ruby', 'Python']}
>>> data.setdefault('names', []).append('C')
>>> data
{'names': ['Ruby', 'Python', 'C']}

试图索引一个不存在的键将会抛出一个 keyError 错误(这点和Java不同,Java会返回Null)。我们可以使用 dict.get(key, default) 来索引键,如果键不存在,那么返回指定的 default 值。

>>> data['foo']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'foo'
>>> data.get('foo', 0)
0

 

    原文作者:python入门
    原文地址: https://my.oschina.net/pierrecai/blog/899202
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞