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

列表

  • 列表支持切片操作
  • 详细的列表方法说明可参阅这里:深入列表
  • 列表还可以作为栈和队列使用。但作为队列使用时在开头插入和弹出元素效率慢,可使用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 a
set(['a', 'r', 'b', 'c', 'd'])
>>> a - b                              # letters in a but not in b
set(['r', 'd', 'b'])
>>> a | b                              # letters in either a or b
set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
>>> a & b                              # letters in both a and b
set(['a', 'c'])
>>> a ^ b                              # letters in a or b but not both
set(['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 tel
True
>>> 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值