• enumerate小技巧和列表推导式


    1.enumerate

    enumerate函数用于遍历序列中的元素以及它们的下标,这样你就可以通过index 直接定位你的数据了。

    之前对list操作的时候,即想取到下表,又想取到对应值,我是这么来实现的。

     1 list=['a','b','c']
     2 for ind in range(len(list)):
     3     print ind,list[ind]
     4 
     5 #运行结果是:
     6 >>> 
     7 0 a
     8 1 b
     9 2 c
    10 >>> 

    但是你有了enumerate之后就瞬间感觉高大上了,因为你一步到位了。

    1 list=['a','b','c']
    2 for ind ,value in enumerate(list):
    3     print ind,value
    4 #运行结果为:
    5 0 a
    6 1 b
    7 2 c
    8 >>> 

    enumerate 函数用于遍历序列中的元素以及它们的下标:

    遍历元祖:

    1 for i,j in enumerate(('a','b','c')):
    2     print i,j
    3 #运行结果:
    4 0 a
    5 1 b
    6 2 c

    遍历列表:

    1 for i,j in enumerate([1,2,3]):
    2     print i,j
    3 #运行结果
    4 0 1
    5 1 2
    6 2 3

    遍历字典:

    1 for i,j in enumerate({'a':1,'b':2}):
    2     print i,j
    3 #运行结果 
    4 0 a
    5 1 b

    遍历字符串:

    1 for i,j in enumerate('abc'):
    2     print i,j
    3 #运行结果:
    4 0 a
    5 1 b
    6 2 c

     2.从for循环到列表推导式

    每个列表推导都可以重写成for循环的形式,但并不是每一个for循环都可以重写成列表推导。要理解什么时候该使用列表推导,关键在于不断练习辨别哪些问题看起来像是列表推导。

    如果你能把你的代码重写成这个样子的for循环,那你就能把它重写成列表推导:

    普通for循环操作:

    1 numbers=[1,2,3,4,5]
    2 
    3 doubled_numbers=[]4 for n in numbers:
    5     doubled_numbers.append(n*2)
    6 print doubled_number

     列表推导式:

    1 numbers=[1,2,3,4,5]
    2 
    3 doubled_numbers1=[]
    4 
    5 doubled_numbers1=[n*2 for n in numbers]
    6 
    7 print '****=',doubled_numbers1

    操作步骤:

    1. 复制给新列表赋值的语句(第三行) doubled_numbers=[]

    2. 把我们append到新列表的表达式复制过来(第五行)doubled_numbers=[n*2]

    3. 复制for循环的那一行:(第四行)doubled_numbers=[n*2 for n in numbers]

    下面我们在来一个多一个条件判断的:

    1 numbers = [1, 2, 3, 4, 5]
    2  
    3 doubled_odds = []
    4 doubled_odds1 = []
    5 for n in numbers:
    6     if n % 2 == 1:
    7         doubled_odds.append(n * 2)
    8 
    9 print 'doubled_odds=',doubled_odds

    列表推导式:

    1 numbers = [1, 2, 3, 4, 5]
    2  
    3 doubled_odds1 = []
    4 
    5 doubled_odds1 = [n*2 for n in numbers if n % 2 ==1]
    6 
    7 print 'doubled_odds=', doubled_odds1

    操作步骤:

    1. 复制给新列表赋值的语句(第四行) doubled_numbers1=[]

    2. 把我们append到新列表的表达式复制过来(第七行)doubled_numbers1=[n*2]

    3. 复制for循环的那一行:(第五行)doubled_numbers1=[n*2 for n in numbers]

    4. 复制if语句,除去末尾的:(第六行)doubled_numbers1=[n*2 for n in numbers if n % 2 ==1]

    嵌套循环:

    1 matrix=[[1,2],[3,4],[5,6]]
    2 flattened = []
    3 flattened1 = []
    4 for row in matrix:
    5     for n in row:
    6         flattened.append(n)
    7 print 'flattened=',flattened

    列表推导式:

    1 flattened1=[n for row in matrix for n in row]
    2 print 'flattened1=',flattened1

    注意:不要把这个列表推导写成这个样子:

    flattened 1= [n for n in row for row in matrix]

    这里把两个循环颠倒了,上面的那个才是正确的。

     在处理列表推导里的嵌套for循环时,要记住:for语句的顺序和原来的循环中for语句的顺序是一样的。

    字典推导

    普通推导:

    1 #key 和value调换位置
    2 dic = {'a':1, 'b':2, 'c':3, 'd':4}
    3 dic_list = {}
    4 dic_list1 = {}
    5 for key, value in dic.items():
    6     dic_list[value] = key
    7 
    8 print 'dic_list=', dic_list

    字典推导:

    1 dic_list1 = { value: key for key, value in dic.items()}
    2 print 'dic_list1=', dic_list1

    换行后逻辑语句还原,这样写是不对的

    flipped = {

        value: key

        for key, value in original.items()

    }

    注意,我们不是随便换行的:在写列表推导的时候我们复制粘贴了很多条语句,我们是在这些语句之间换行的。在用各种颜色标注的版本中,我们是在颜色发生变化时换行的。

  • 相关阅读:
    java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单
    java攻城狮之路(Android篇)--MP3 MP4、拍照、国际化、样式主题、图片移动和缩放
    java攻城狮之路(Android篇)--BroadcastReceiver&Service
    内存调试的东西D/dalvikvm( 809 ): GC_CONCURRENT freed
    java攻城狮之路(Android篇)--Activity生命
    java攻城狮之路(Android篇)--与服务器交互
    java实例练习
    java攻城狮之路(Android篇)--ListView与ContentProvider
    java攻城狮之路(Android篇)--SQLite
    Android中使用自身携带的Junit新建一个测试工程
  • 原文地址:https://www.cnblogs.com/chushiyaoyue/p/5382640.html
Copyright © 2020-2023  润新知