迭代
在Python中,如果给定一个list或tuple,可以通过for循环来遍历这个list或tuple, 这种遍历称为迭代。
Python中,迭代是通过 for … in 来完成的。
Python 的 for循环不仅可以用在list或tuple上,还可以作用在其他任何可迭代对象上。
# 用for循环迭代数列 1-100 并打印出7的倍数
for i in range(1,101)[6::7]:
print i
索引迭代 enumerate() 函数
Python中,迭代永远是取出元素本身,而非元素的索引
对于有序集合,如果想用for循环拿出索引, 可以使用 enumerate() 函数
>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> for index, name in enumerate(L):
... print index, '-', name
...
0 - Adam
1 - Lisa
2 - Bart
3 - Paul
使用 enumerate() 函数,可以在for循环中同时绑定索引index和元素name,实际上,enumerate() 函数把
[‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’]
变成了一个类似:
[(0, ‘Adam’), (1, ‘Lisa’), (2, ‘Bart’), (3, ‘Paul’)]
因此,迭代的每一个元素实际上是一个tuple
for t in enumerate(L):
index = t[0]
name = t[1]
print index, '-', name
如果我们知道每个tuple元素都包含两个元素,for循环又可以进一步简写为:
for index, name in enumerate(L):
print index, '-', name
因此,索引迭代也不是真的按索引访问,而是由 enumerate() 函数自动把每个元素变成 (index, element) 这样的tuple,再迭代,就同时获得了索引和元素本身。
zip()函数可以把两个 list 变成一个 list:
>>> zip([10, 20, 30], ['A', 'B', 'C'])
[(10, 'A'), (20, 'B'), (30, 'C')]
迭代dict的value
通过普通的迭代方法 for … in, 每次循环可以拿到dict的一个key。
values()
如果需要迭代dict 对象的value,dict对象有一个values()方法可以做到, 这个方法吧dict转换成一个包含所有value的list, 这样迭代的就是dict的每一个value:
d = {'chris':95,'john':85}
print d.values()
# [85,95]
for v in d.values():
print v
# 85
# 95
itervalues()
dict对象中的itervalues()方法与values()对于迭代dict中的value,效果是一样的:
d = {'chris':95,'john':85}
print d.itervalues()
# <dictionary-valueiterator object at 0x106adbb50>
for v in d.itervalues():
print v
# 85
# 95
练习:计算一个班所有同学的平均分
d = { 'Adam': 95, 'Chris': 85, 'Bart': 59, 'Paul': 74 }
sum = 0.0
for score in d.itervalues():
sum += score
print sum/len(d)
# 78.25
values()与itervalues()的不同之处:
- values()方法实际上是把一个dict转换成一个只包含dict中value的list。
- itervalues()方法不会转换,它会在迭代的过程中依次从dict中取出value,所以itervalues()方法比values()方法节省了生成list所需的内存。
打印itervalues() 返回的是一个 <dictionary-valueiterato> 对象,说明在Python中,for循环可作用的迭代对象远不止list, tuple, str, unicode, dict等,任何可迭代对象都可以作用于for 循环,而内部如何迭代通常并不用关心。
如果一个对象说自己可迭代,那就直接用 for 循环去迭代它,可见,迭代是一种抽象的数据操作,它不对迭代对象内部的数据有任何要求。
同时迭代dict的key,value
items()
在一个for循环中,同时迭代dict的key,value, 可以利用dict对象的 items()方法。
items()方法把dict对象转换成一个包含tuple的list:
# items()的返回值
>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
>>> print d.items()
[('Lisa', 85), ('Adam', 95), ('Bart', 59)]
如果对这个list进行迭代,就可以同时获得key和value:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
for key, value in d.items():
print key, ':', value
# Lisa : 85
# Adam : 95
# Bart : 59
iteritems()
items()也有一个对应的iteritems(), iteritems()不把dict转换成list,而是在迭代过程中不断的给出tuple,所以,iteritems()不占用额外的内存。
练习: 用name:score 打印出全部人的成绩,最后打印出平均分
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74 }
sum = 0.0
for k, v in d.iteritems():
sum = sum + v
print k,':',v
print 'average', ':', sum/len(d)
# Lisa : 85
# Paul : 74
# Adam : 95
# Bart : 59
# average : 78.25