python迭代工具

1 并行迭代

2 按索引迭代

1.并行迭代

   有时候,一个程序中需要我们同事在一个for循环中迭代两个以上的集合。其中一种方法就是循环其中一个集合的索引,然后根据索引对所有集合进行循环,例如:

[python]  view plain  copy
  1. names = ['anne','beth','george','damon']  
  2. ages = [12,45,32,102]  
  3. for i in range(len(names)):  
  4.     print(names[i],'is',ages[i],'years old')  

   更方便的就是使用內建的zip函数进行并行迭代,可以把序列压在一起,然后返回一个元组的列表:

[plain]  view plain  copy
  1. >>>zip(names,ages)  
  2. [('anne',12),('beth',45),('george',32),('damon',102)]  
   现在我们可以在循环中解包元组:

[python]  view plain  copy
  1. for name,age in zip(names,ages):  
  2.     print(name,'is',age,'year old')  
   zip函数可以作用于任意多的序列,如:

[python]  view plain  copy
  1. for name,age,number in zip(names,ages,range(4)):  
  2.     print(number,':',name,'is',age,'year old')  


2.编号迭代

    有些时候想要迭代序列中的对象,同时还想要获取当前对象的索引。例如没在一个字符串列表中替换多有含'xxx'的子字符串。实现的方法肯定很多,例如:

[python]  view plain  copy
  1. index = 0  
  2. for string in strings:  
  3.     if 'xxx' in strings:  
  4.         strings[index] = '[censored]'  
  5.     index += 1  
   其中一个比较方便的方法就是使用內建的·enumerate函数:

[python]  view plain  copy
  1. for index,string in enumerate(strings):  
  2.     if 'xxx' in strings:  
  3.         strings[index] = '[censored]'  

   这个函数可以在提供索引的地方迭代索引-值对。


  在Python中,对于循环遍历一些集合(例如序列或者字典等对象)的时候,最好使用for循环

1.for循环遍历序列

[python]  view plain  copy
  1. numbers = [0,1,2,3,4,5,6,7,8,9]  
  2.   
  3. for number in numbers:  
  4.     print(number)  
    需要说明的是,其中for number in numbers 中的number可以换成其他标识符,例如可以写成for num in numbers。

    另外,因为循环迭代某个范围的数字是很常见的,所以Python中有个内建的范围函数提供使用:

[plain]  view plain  copy
  1. >>>range(0,10)  
  2. [0,1,2,3,4,5,6,7,8,9]  
   range()函数的工作方式类似于分片。它包含下限,但是不包含上限。

   例如,下面程序会打印1~100的数字:

[python]  view plain  copy
  1. for number in range(1,101):  
  2.     print(number)  
2.for循环遍历元组

    在Python中,for循环迭代元组与序列差不多

[python]  view plain  copy
  1. words = {'I','am','a','man'}  
  2.   
  3. for word in words:  
  4.     print(word)  
    输出为:

[plain]  view plain  copy
  1. am  
  2. I  
  3. a  
  4. man  
    因为对于字符型的集合,输出集合中的元素的时候,不会保存顺序,所以集合中元素的顺序通常是没有定义的,与序列相同for word in words中的word标识符也是可以随意更改。
3.for循环遍历字典

    一个简单的for语句能循环字典中的所有的键或者值,就像处理序列一样:

    循环迭代键:

[python]  view plain  copy
  1. d = {'x':1,'y':2,'z':3}  
  2.   
  3. for key in d.keys():  
  4.     print(key)  
    循环迭代值:

[python]  view plain  copy
  1. d = {'x':1,'y':2,'z':3}  
  2.   
  3. for value in d.values():  
  4.     print(value)  
    d.items方法还可以将键-值对作为元组放回,for循环的一大好处就是可以在循环中使用序列解包

[python]  view plain  copy
  1. d = {'x':1,'y':2,'z':3}  
  2.   
  3. for key,value in d.items():  
  4.     print(key,':',value)  





本文实例讲述了Python中迭代的用法,是一个非常实用的技巧。分享给大家供大家参考借鉴之用。具体分析如下:

如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Iteration)。

在Python中,迭代是通过for ... in来完成的,而很多语言比如C或者Java,迭代list是通过下标完成的,比如Java代码:

?
1
2
3
for (i = 0 ; i< list .length; i + + ) {
   n = list [i];
}

可以看出,Python的for循环抽象程度要高于Java的for循环,因为Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。

list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代:

?
1
2
3
4
5
6
7
>>> d = { 'a' : 1 , 'b' : 2 , 'c' : 3 }
>>> for key in d:
...   print key
...
a
c
b

因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。

默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.itervalues(),如果要同时迭代key和value,可以用for k, v in d.iteritems()。

由于字符串也是可迭代对象,因此,也可以作用于for循环:

?
1
2
3
4
5
6
>>> for ch in 'ABC' :
...   print ch
...
A
B
C

所以,当我们使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行,而我们不太关心该对象究竟是list还是其他数据类型。

那么,如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:

?
1
2
3
4
5
6
7
>>> from collections import Iterable
>>> isinstance ( 'abc' , Iterable) # str是否可迭代
True
>>> isinstance ([ 1 , 2 , 3 ], Iterable) # list是否可迭代
True
>>> isinstance ( 123 , Iterable) # 整数是否可迭代
False

最后一个小问题,如果要对list实现类似Java那样的下标循环怎么办?Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

?
1
2
3
4
5
6
>>> for i, value in enumerate ([ 'A' , 'B' , 'C' ]):
...   print i, value
...
0 A
1 B
2 C

上面的for循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:

?
1
2
3
4
5
6
>>> for x, y in [( 1 , 1 ), ( 2 , 4 ), ( 3 , 9 )]:
...   print x, y
...
1 1
2 4
3 9

小结:

任何可迭代对象都可以作用于for循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值