Python学习总结(4)-数据结构

来源:互联网 发布:java手游服务器框架 编辑:程序博客网 时间:2024/06/04 18:37

列表

  • 列表支持切片操作
  • 详细的列表方法说明可参阅这里:深入列表
  • 列表还可以作为栈和队列使用。但作为队列使用时在开头插入和弹出元素效率慢,可使用collections.deque

map()、filter()、reduce()

  • map()filter()reduce()函数的作用与JavaScript中类似。
  • filter(function, sequence)返回的序列由function(item)结果为真的元素组成。结果始终是列表,除非序列是字符串或元组。
  • map(function, sequence)为每个元素调用function(item函数并返回结果的列表。
  • map可以传入多个序列,传入的函数也必须有和序列数目相同的参数。执行时会以此用各序列上对应的元素来调用函数。
>>> seq = range(8)>>> def add(x, y): return x+y...>>> map(add, seq, seq)[0, 2, 4, 6, 8, 10, 12, 14]
  • reduce(function, sequence)只返回一个值。
    • 它首先以序列的前两个元素调用函数,然后再以返回结果和下一个元素继续调用。
    • 如果序列只有一个元素,将直接返回,如果序列为空,则引发异常
    • 函数可以传入第三个参数作为初始值,此时如果序列为空则返回初始值。否则就以初始值和序列第一个元素调用函数,以此类推。

列表推导式

列表推导式由括号括起来,括号里面包含一个表达式,表达式后面跟着一个for语句,后面还可以接零个或更多的forif语句。结果是一个新的列表,由表达式依据其后面的forif子句上下文计算而来的结果构成。例如

 squares = []for x in range(10):    squares.append(x**2)#相当于squares = [x**2 for x in range(10)]combs = []for x in [1,2,3]:    for y in [3,1,4]:        if x != y:            combs.append((x, y))# 相当于[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
  • 列推导式可以嵌套列推导式
matrix = [     [1, 2, 3, 4],     [5, 6, 7, 8],     [9, 10, 11, 12], ] [[row[i] for row in matrix] for i in range(4)] # output [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

元组

  • 元组由逗号分割的若干值组成。
 t = 12345, 54321, 'hello!' u = t, (1, 2, 3, 4, 5) empty = () singleton = 'hello', 
  • 元组是不可变的

集合

  • 集合中的元素没有顺序且不会重复,类似于Java中的Set
  • 集合的基本用途有成员测试和消除重复的条目。
  • 集合对象还支持并集、交集、差和对称差等数学运算。
  • 集合使用花括号或set([iterable])创建。
  • 集合也支持推导式。
>>> a = set('abracadabra')>>> b = set('alacazam')>>> a                                  # unique letters in aset(['a', 'r', 'b', 'c', 'd'])>>> a - b                              # letters in a but not in bset(['r', 'd', 'b'])>>> a | b                              # letters in either a or bset(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])>>> a & b                              # letters in both a and bset(['a', 'c'])>>> a ^ b                              # letters in a or b but not bothset(['r', 'd', 'b', 'm', 'z', 'l'])

字典

  • 字典类似于Java中的Map
  • 字典中的key可以是任意不可变类型。如果元祖只包含字符串、数字或元祖也可以用作key
  • 字典也可使用推导式。
>>> tel = {'jack': 4098, 'sape': 4139}>>> tel['guido'] = 4127>>> tel{'sape': 4139, 'guido': 4127, 'jack': 4098}>>> tel['jack']4098>>> del tel['sape']>>> tel['irv'] = 4127>>> tel{'guido': 4127, 'irv': 4127, 'jack': 4098}>>> tel.keys()['guido', 'irv', 'jack']>>> 'guido' in telTrue>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])

遍历

遍历索引和对应的值

for i, v in enumerate(['tic', 'tac', 'toe']):    print i, v

同时遍历多个序列

questions = ['name', 'quest', 'favorite color']answers = ['lancelot', 'the holy grail', 'blue']for q, a in zip(questions, answers):     print 'What is your {0}?  It is {1}.'.format(q, a)

反向遍历序列

for i in reversed(xrange(1,10,2)):    print i

排序顺序循环序列

sorted返回一个新的排序的列表。

basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']for f in sorted(set(basket)):    print f

遍历字典的键和值

knights = {'gallahad': 'the pure', 'robin': 'the brave'}for k, v in knights.iteritems():    print k, v
0 0