第十节课:再议数据结构与数据类型

一、list, dict, tuple之它们其实是好基友 

    1. 没有最优秀的数据结构,只有最适用的. 

    2. 了解每个数据结构才能活学活用    

    3. 它们相互转化如此简单 

    ps:如果一个问题能用Python的内置数据类型解决,推荐使用内置的数据类型,这样做的效率是比较好的. 

    list[1,2,3,4] 是有序的 

    list[0]

    list[1]

    list[2]

    如果涉及到的问题是有顺序的就可以考虑使用list

    字典是键值(本质上list也是键值,键就是游标,只不过是整型), 但字典的键可以是字符串(语义性更强,这在现实中有很多场景,比如学生所有课程的成绩),也可以是tuple.

    元组与列表转换

    a = [1,2,3,4]

    a = list(a)

    a = tuple(a)

    将list转成字典 , list需要满足一定格式

    a = [(1,3),(2,4)]

    a = dict(a)

    这种方法是比较常用的. 在实际处理数据的过程中,我们可以会碰到各种各样的情况,这时候对数据结构进行转换并使用恰当方法对原数据进行处理显的很重要. 

二、“推导式”(列表推导)再议

推导式的性能是非常不多的,我们要多使用. 下面我们看看列表推导式的本质. 

    # coding=utf-8



    """

    [0,1,2,3,4,5,6,7,8,.....,100]



    """



    x = [x for x in xrange(101)]

    print x 



    """ 进行拆解,从外到里,从左到右

    第一部分 []

    第二部分 x 

    第三部分 for x in xrange(101)

    """



    new_list = []

    for x in xrange(101):

        new_list.append(x)



    print new_list



    """

三、排序

    1. sorted

查看整型的帮助文档有两个方法,如下

    help(1)

    help(int)



    help(sorted)



    >>> help(sorted)

        Help on built-in function sorted in module __builtin__:



    sorted(...)

        sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list



    iterable: 必选参数,填入一个可迭代对象

    reverse:  反转,倒序 



    >>> a = [1,2,3,4]

    >>> sorted(a,reverse=True)

    [4, 3, 2, 1]

    >>> a

    [1, 2, 3, 4]


    注意:sorted并不是原地更改,需要赋值. 这和 sort方法不一样. 


    >>> help(a.sort)

        Help on built-in function sort:



    sort(...)

        L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;

        cmp(x, y) -> -1, 0, 1



    sort和sorted参数是一样的. 



    >>> a = [1,2,3,4]

    >>> a.sort(reverse = True)

    >>> a

    [4, 3, 2, 1]



    注意: sort原地修改a, 这个sorted是不同的, 另外两者使用方法是不一样的. sorted(a, reverse=True)  a.sort(reverse=True) sorted本质上是针对可迭代对象的函数, 而sort是针对可迭代对象的内置方法. 

    2. list之sort方法

      2.1 key 最好用 

      2.2 cmp是什么 (a>b) - (a<b)

下面我们讲讲key可选参数 : key是对列表中的元素进行操作,并针对操作后的结果进行排序. 

    a = ['12323', '2343443', '99']

    a.sort(key=int)  # 将字符以数字的形式进行排序 



    a = [('a',2),('c',4),('b',3)]

    a.sort(key = lambda x: x[1])

    a.sort(key = lambda x: x[1], reverse = True)





    cmp(2,1) == (2>1) - (2<1) == 1 - 0 == 1

    cmp(1,3) == (1>3) - (1<3) == 0 - 1 == -1

    cmp(2,2) == (2>2) - (2<2) == 0 - 0 == 0 



    cmp(a,b)返回三个值, a>b 返回1, a<b 返回 -1, a=b 返回0



    cmp 在python3中已经被废弃,性能也不好. 

    3. 多级排序怎么办

    >>> a = [(5,6,3),(3,6,9),(1,7,5)]

    >>> import operator 

    >>> a.sort(key=operator.itemgetter(1,2))

    >>> a

    [(5, 6, 3), (3, 6, 9), (1, 7, 5)]  # 先根据游标1 进行排序后,在根据游标2 进行排序. 



    关于模块 operator 可以自行深入研究. 

    4. 字典如何排序

    作为作业可以自行研究. 

四、字符串模板应用  

1. 回忆一下,字符串模板有哪几种方式? 

    '%s is a %s' % ('he','boy')

    '%(who)s is a %(gender)s' % dict(who = 'he', gender = 'boy')

    '%(who)s is a %(gender)s' % {'who':'he', 'gender':'boy'}



    '{who} is a {gender}'.format(who = 'he', gender = 'boy')

    '{} is a {}'.format('he', 'boy')

2. 典型应用1: html模板

    http://news.163.com/16/0529/01/BO6S19K100014AED.html

    网易首页 > 新闻中心 > 滚动新闻 > 正文

    华东理工研二学生命丧导师参股工厂(图)

    2016-05-29 01:47:34 来源: 新京报(北京)



    http://news.163.com/16/0528/19/BO651SAG000146BE.html

    网易首页 > 新闻中心 > 滚动新闻 > 正文

    总理力推“放管服” 国务院准备这么做

    2016-05-28 19:09:36 来源: 中国新闻网(北京)



    整个网页都是模板做的,留着占位符,动态地把请求的内容往里面填写. 

3. 针对性比强大更重要 

    我们虽然推荐用.format形式, 但也要根据实际情况分析, 当数据库中是键值对的时候,可能用占位符 + 字典形式传入会更好.

一、list, dict, tuple之它们其实是好基友     1. 没有最优秀的数据结构,只有最适用的.     2. 了解每个数据结构才能活学活用        3. 它们相互转化如此简单 

    ps:如果一个问题能用Python的内置数据类型解决,推荐使用内置的数据类型,这样做的效率是比较好的. 
    list[1,2,3,4] 是有序的     list[0]    list[1]    list[2]
    如果涉及到的问题是有顺序的就可以考虑使用list    字典是键值(本质上list也是键值,键就是游标,只不过是整型), 但字典的键可以是字符串(语义性更强,这在现实中有很多场景,比如学生所有课程的成绩),也可以是tuple.
    元组与列表转换
    a = [1,2,3,4]    a = list(a)    a = tuple(a)
    将list转成字典 , list需要满足一定格式    a = [(1,3),(2,4)]    a = dict(a)
    这种方法是比较常用的. 在实际处理数据的过程中,我们可以会碰到各种各样的情况,这时候对数据结构进行转换并使用恰当方法对原数据进行处理显的很重要. 



二、“推导式”(列表推导)再议推导式的性能是非常不多的,我们要多使用. 下面我们看看列表推导式的本质. 
# coding=utf-8
"""[0,1,2,3,4,5,6,7,8,.....,100]
"""
x = [x for x in xrange(101)]print x 
""" 进行拆解,从外到里,从左到右第一部分 []第二部分 x 第三部分 for x in xrange(101)"""
new_list = []for x in xrange(101):new_list.append(x)
print new_list
"""

三、排序    1. sorted 
    c查看整型的帮助文档有两个方法,如下    help(1)    help(int)
    help(sorted)
    >>> help(sorted)Help on built-in function sorted in module __builtin__:
sorted(...)    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
    iterable: 必选参数,填入一个可迭代对象    reverse:  反转,倒序 


    >>> a = [1,2,3,4]>>> sorted(a,reverse=True)[4, 3, 2, 1]>>> a[1, 2, 3, 4]
注意:sorted并不是原地更改,需要赋值. 这和 sort方法不一样. 
>>> help(a.sort)Help on built-in function sort:
sort(...)    L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;    cmp(x, y) -> -1, 0, 1
    sort和sorted参数是一样的. 
    >>> a = [1,2,3,4]>>> a.sort(reverse = True)>>> a[4, 3, 2, 1]
注意: sort原地修改a, 这个sorted是不同的, 另外两者使用方法是不一样的. sorted(a, reverse=True)  a.sort(reverse=True) sorted本质上是针对可迭代对象的函数, 而sort是针对可迭代对象的内置方法. 

    2. list之sort方法      2.1 key 最好用       2.2 cmp是什么 (a>b) - (a<b)


下面我们讲讲key可选参数 : key是对列表中的元素进行操作,并针对操作后的结果进行排序. 
a = ['12323', '2343443', '99']a.sort(key=int)  # 将字符以数字的形式进行排序 

a = [('a',2),('c',4),('b',3)]a.sort(key = lambda x: x[1])a.sort(key = lambda x: x[1], reverse = True)

cmp(2,1) == (2>1) - (2<1) == 1 - 0 == 1    cmp(1,3) == (1>3) - (1<3) == 0 - 1 == -1    cmp(2,2) == (2>2) - (2<2) == 0 - 0 == 0 
    cmp(a,b)返回三个值, a>b 返回1, a<b 返回 -1, a=b 返回0
    cmp 在python3中已经被废弃,性能也不好. 

    3. 多级排序怎么办
>>> a = [(5,6,3),(3,6,9),(1,7,5)]>>> import operator >>> a.sort(key=operator.itemgetter(1,2))>>> a[(5, 6, 3), (3, 6, 9), (1, 7, 5)]  # 先根据游标1 进行排序后,在根据游标2 进行排序. 
关于模块 operator 可以自行深入研究. 

    4. 字典如何排序    作为作业可以自行研究. 


四、字符串模板应用  1. 回忆一下,字符串模板有哪几种方式? 


'%s is a %s' % ('he','boy')'%(who)s is a %(gender)s' % dict(who = 'he', gender = 'boy')'%(who)s is a %(gender)s' % {'who':'he', 'gender':'boy'}
'{who} is a {gender}'.format(who = 'he', gender = 'boy')'{} is a {}'.format('he', 'boy')


2. 典型应用1: html模板
http://news.163.com/16/0529/01/BO6S19K100014AED.html网易首页 > 新闻中心 > 滚动新闻 > 正文华东理工研二学生命丧导师参股工厂(图)2016-05-29 01:47:34 来源: 新京报(北京)
http://news.163.com/16/0528/19/BO651SAG000146BE.html网易首页 > 新闻中心 > 滚动新闻 > 正文总理力推“放管服” 国务院准备这么做2016-05-28 19:09:36 来源: 中国新闻网(北京)
整个网页都是模板做的,留着占位符,动态地把请求的内容往里面填写. 


3. 针对性比强大更重要 我们虽然推荐用.format形式, 但也要根据实际情况分析, 当数据库中是键值对的时候,可能用占位符 + 字典形式传入会更好.

原文地址:https://www.cnblogs.com/huiming/p/5540158.html