zoukankan      html  css  js  c++  java
  • list操作总结. dict操作及文件操作

    1: 列表的操作

    help(list)                 # 列表的帮助,列出所有列表的用法
    type(name)                 # type判断数据类型是列表还是字典或者元组 
    isinstance("字符", "数据类型")   # 判断数据类型,比type高效,返回布尔值. 
    
    例: 
    a = ["yangbin"]
    print isinstance(a, list)  # True
    
    shoplist = ['apple','mango','carrot','banana']              #  创建列表
    shoplist.append('rice')                      # 增。列表尾添加一个项目
    shoplist.insert(2,"c jk")                     # 增。 在列表的第三个位置插入一个元素,从0开始算起
    
    del shoplist[0]                              # 删。根据索引删除列表中的项目
    shoplist.remove('apple')                     # 删。根据内容删除元素
    shoplist.pop()                              # 删。删除最后一个元素并输出
     
    # shoplist["apple"] ="xigua"                  # 改。 通过内容修改
    shoplist[0]="apple"                          # 改。 通过索引修改
    
    len(shoplist)                                          # 查。查看列表的元素个数
    max(shoplist)                                         # 查。列表中的最大值
    min(shoplist)                                          # 查。列表中的最小值
    shoplist.count('apple')                              # 查。输出列表中某个元素的个数
    if  apple in shoplist                               # 查。搜索apple是否在列表中
    shoplist.index("apple")                       # 查。 输出apple元素在列表中的位置
    
    例:
      arr = ["java", "php", "python", "js","python", "js"]
      print arr.index("js",4)
         
    shoplist[0]                                             # 分片查,输出索引为0的元素,即第一个元素
    shoplist[0:2]                                          # 分片查,输出前三个元素
    shoplist[:]                                              # 分片查。输出所有
    shoplist[1:]                                            # 分片查。输出第二个和后面所有的
    shoplist[0:-1]                                         # 分片查:除了最后一个都输出**
    
    shoplist.sort()                 # 查。 将项目按首字母排序 ,数字>大写>小写,返回值为None,修改源文件
    shoplist.reverse()              # 查。 项目顺序倒转。 返回值为None,修改源文件
    
    print s.upper()  # HELLO PYTHON  全部转换成大写. 
    print s.lower()  # hello python  全部转换成小写. 
    print s.capitalize()  # Hello Python  首字母大写,其他都小写. 
    print s.title()  # Hello Python  每个单词首字母大写,其他都小写. 
    print "A".isupper()  # True  用于判断 
    print "A".islower()  # False 
    print "Python Is Good".istitle()  # True 
    

    二: 列表的遍历——查

    1: for x  in list
           print x
    
    2:   for i, element in enumerate(list):  # for循环将列表中的元素及他们的下标打印出来.
            print i,element  
    

    三:split vs join——字符串和列表直接的转化

    1: split、 将字符串转为列表
    格式:

    字符串.split("字符串的分隔方式")      
    

    举例:

    ip = '192.168.1.11'
    ip1=ip.split(".")         # split按要求将字符串转换为列表,以".”为分割符,分成不同的元素 
    ['192','168','1','11']  
    
    In [1]: a = "192/168/1/2"
    In [3]: a.split("/")         # 本例以/作为分隔符
    Out[3]: ['192', '168', '1', '2']
    

    2:join——讲列表转为字符串

    In [10]: a = ['192', '168', '1', '2']
    
    In [12]: " ".join(a)
    Out[12]: '192 168 1 2'
    
    In [13]: "#".join(a)
    Out[13]: '192#168#1#2'
    
    In [14]: ".".join(a)
    Out[14]: '192.168.1.2'
    

    四:列表生成式

    格式:

    [ x  for  x in 内容] 
    [ x  for  x in 内容 if 条件] 
    
    1:把要生成的元素 x 放到前面,执行的时候,先执行后面的for循环
    2:后面跟上for循环,可以有多个for循环,也可以在for循环后面再加个if条件
    3:for循环后面可以是任何方式的迭代器(元组,列表,生成器..),只要可迭代对象的元素中至少有一个值.
    

    举例:

    In [4]: [x for x in 'abcd']
    Out[4]: ['a', 'b', 'c', 'd']
    
    In [25]: res = [8, 9, 10, 11, 12, 13]
    In [25]: [ x for x in res if x >10 ]
    Out[25]: [11, 12, 13]
    
    原生实现
    In [30]: ssss = []
    In [31]: for x in res:
       ....:     if x > 10:
       ....:         ssss.append(x)
       ....:         
    In [32]: ssss
    Out[32]: [11, 12, 13]
    

    五:列表在线上环境上的小小应用——让sql语句更优雅

    1:不优雅的sql

    sql = "select  id, name,age,email,job  from user"
    sql = "select  id, name,age,email,job  from user"
    

    优点:

    • 简单容易读

    缺点:

    • 如果列比较多,sql会很长,很不优雅
    • 如果显示的列有变动,如果有多条sql语句修改会比较麻烦

    2:优雅的方式

    fields = ["id","name","age","email"]  # 将要输出列定义到列表中,每次变动只需要修改列表就行
    sql = "select %s from user" % ",".join(fields)
    
    结果:
    sql = "select  id, name,age,email from user" 
    

    字典三种格式:

    字典,字典里面套字典,字典里面套列表. 
    删除字典时指定key就OK. 
    删除时使用pop()函数,原地修改,字典没有remove()函数. 
    

    字典赋值&修改:

    info = {"name": "yangbin", "age": 20, "hobby": {"sport": "basketball"}, "gramm": ["java", "python"]}
    print info  # {'hobby': {'sport': 'basketball'}, 'age': 20, 'gramm': ['java', 'python'], 'name': 'yangbin'}
    
    info["name"] = "yangguo"  # 更改key对应的value.  
    print info  # {'hobby': {'sport': 'basketball'}, 'age': 20, 'gramm': ['java', 'python'], 'name': 'yangguo'}
    
    info.pop("age")  # 删除key为"age"的这个字典; pop()函数的删除是对源文件删除,默认返回被删除的值.  
    print info  # {'hobby': {'sport': 'basketball'}, 'gramm': ['java', 'python'], 'name': 'yangguo'}
    
    info["gramm"][0] = "js"  # 更改字典里面value为list的值;字典是无序的,因此不能使用索引. 
    print info  # {'hobby': {'sport': 'basketball'}, 'gramm': ['js', 'python'], 'name': 'yangguo'}
    
    info["hobby"]["sport"] = "football"  # 更改字典里面key对应的值为字典的value的值.
    print info  # {'hobby': {'sport': 'football'}, 'gramm': ['js', 'python'], 'name': 'yangguo'}
    
    info["year"] = 2017  # 当字典中没有该key时,就会字典添加到字典中去. 
    print info
    

    查询:以list形式返回.

    info = {"name": "yangbin", "age": 20, "hobby": {"sport": "basketball"}, "gramm": ["java", "python"]}
    print info.keys()  # ['hobby', 'age', 'gramm', 'name']
    print info.values()  # [{'sport': 'basketball'}, 20, ['java', 'python'], 'yangbin']
    print info.items()  # [('hobby', {'sport': 'basketball'}), ('age', 20), ('gramm', ['java', 'python']), ('name', 'yangbin')]
    

    get()函数:

    info = {"name": "yangbin", "age": 20, "hobby": {"sport": "basketball"}, "gramm": ["java", "python"]}
    print info["name"]  # yangbin
    print info["nameee"]  # 报错: KeyError: 'nameee',该步错误会导致整个程序挂掉!
    

    解决该问题的办法: 使用get()函数.

    print info.get("name")  # yangbin
    print info.get("nameee")  # 返回空值 None
    print info.get("nameee", "not exist")  # 返回指定的值"not exist". 
    print info.get("name", "NO")  # yangbin  如果查询的key存在,则返回该key对应的value.  
    

    判断key是否存在:

    info = {"name": "yangbin", "age": 20, "hobby": {"sport": "basketball"}, "gramm": ["java", "python"]}
    res = info.get("nameeee", "None")
    print res  # None
    if res :
        print "OK"
    else:
        print "NO"
    返回结果为 OK.
    
    res = info.get("nameee", "")
    print res  # 返回空,即返回一个空格. 
    if res: 
        print "OK"
    else:
        print "ON"
    返回结果为 NO.
    
    以上方法可用于判断key是否存在.
    

    使用has_key()判断key是否存在.

    info = {"name": "yangbin", "age": 20, "hobby": {"sport": "basketball"}, "gramm": ["java", "python"]}
    print info.has_key("name")  # True    
    
    if "name" in info:
        print "True"
    else:
        print "False"
    返回结果为 True.
    

    遍历key与对应的value:

    第一种

    info = {"name": "yangbin", "age": 20, "hobby": {"sport": "basketball"}, "gramm": ["java", "python"]}
    for k,v in info.items():
    print k,v
    
    运行结果为: 
    hobby {'sport': 'basketball'}
    age 20
    gramm ['java', 'python']
    name yangbin
    

    第二种:不推荐

    for i in [x for x in info]:
        print i, info[i] 
    
    运行结果为:
    hobby {'sport': 'basketball'}
    age 20
    gramm ['java', 'python']
    name yangbin
    

    注意代码的效率高低问题.

    该示例中,如不指定key或value,则默认索引的是key.

    info = {"name": "yangbin", "age": 20, "hobby": {"sport": "basketball"}, "gramm": ["java", "python"]}
    print [x for x in info]  # ['hobby', 'age', 'gramm', 'name']
    

    根据字典中value的类型提取:

    info = {"name": "yangbin", "age": 20, "hobby": {"sport": "basketball"}, "gramm": ["java", "python"]}
    for k, v in info.items():
        if type(v) == dict:
            for v2,v3 in v.items():
                print "%s的key and value:" % k
                print v2, v3
        elif type(v) == list:
            for v4 in v:
                print v4
        else:
            print k,v
    
    运行结果:  
    =======================
    hobby的key and value:
    sport basketball
    age 20
    java
    python
    name yangbin
    

    判断数据类型的方式:

    type

    isinstance

    >>> a = "python"
    >>> type(a)
    <class 'str'>
    >>> isinstance(a, str)
    True
    >>>
    >>>
    >>> b = {"name": "yangbin"}
    >>> type(b)
    <class 'dict'>
    >>> isinstance(b, dict)
    True
    >>>
    

    统计每个单词出现的次数, 存储为字典的形式:

    str_list = "Docker is transitioning all of its open source collaborations to the Moby project going forward.During the transition all open source activity should continue as usual."
    str_list_new = str_list.split(" ")  # 以空格为分隔符,将字符进行分割.
    str_dic = {}  # 创建空字典,用于存储最后统计的key及key出现的次数.
    for i in str_list_new:
        # print i
        if i not in str_dic:
            str_dic[i] = 1
        elif i in str_dic:
            str_dic[i] += 1
    print str_dic
    

    对上一例题做操作,即字典翻转拼接为num:word的字典
    因为很多单词都出现了一次,一旦k,v翻转,例如数字1作为key,那么这个key的value会一直被覆盖,直到最后一个.
    方案是,把出现的数字作为key,所有出现次数一样的单词存为列表,列表允许重复.

    res = {'forward.During': 1, 'the': 2, 'all': 2}
    if res.has_key("aaaa"):
        res["aaaa"].append("aa")
    else:
        res["aaaa"] = []
    print res  # {'aaaa': [], 'forward.During': 1, 'the': 2, 'all': 2}
    
    if res.has_key("aaaa"):
        res["aaaa"].append("aa")
    else:
        res["aaaa"] = []
    print res  # {'aaaa': ['aa'], 'forward.During': 1, 'the': 2, 'all': 2}
    
    print res.setdefault("aaaa", [])  # ['aa']
    print res  # {'aaaa': ['aa'], 'forward.During': 1, 'the': 2, 'all': 2}
    
    print res.setdefault("bbbb", [])  # []
    print res  # {'aaaa': ['aa'], 'forward.During': 1, 'bbbb': [], 'the': 2, 'all': 2}
    
    # dict.setdefault("key", "value")
    # 当key不存在时,默认将key和value插入;
    # 当key存在时,则不管.
    

    基于上一步“把单词存为字典”后,将单词与数字翻转拼接:

    res = {}
    for k,v in str_dic.items():
        res.setdefault(v, [])
        print res
        res[v].append(k)
        print res
    

    字典生成式

    格式:
    1.在Python2.6或更早的版本,字典生成式可以接受迭代的键/值对:

    d = dict((key, value) for (key, value) in iterable)   
    
    # 第一个k,v的()必须写,第二个()可不写.  
    

    2.从Python2.7或者3以后,可以直接用字典推导式语法:

    d = {key:value for (key, value) in iterable} 
    
    # for后的k,v的括号可以不写 
    

    3.Python2.7以上兼容两种写法,Python2.6只能用第一种。
    4.可以用任何方式的迭代器(list, tuple, 生成式...),只要可迭代对象的元素中有两个值.
    示例:

    dict1 = {1:2, 3:4, 5:6, 7:8, 9:10}
    dict_new = dict((v,k) for k,v in dict1.items())  # 最外面的小括号旁的dict()表示dict函数.
    print dict_new  # {8: 7, 2: 1, 4: 3, 10: 9, 6: 5}
    
    dict1 = {1:2, 3:4, 5:6, 7:8, 9:10}
    dict_new = {v:k for k,v in dict1.items()}
    print dict_new  # {8: 7, 2: 1, 4: 3, 10: 9, 6: 5} 
    

    字符串的格式化:

    print "hello %s" % "Ames"  # C语言风格
    print "hello {}".format("yangbin")  # C#风格
    print "hello {} {}".format("yangbin", "Ames")
    print "hello %s %s" % ("yangbin", "Ames") 
    
    运行结果: 
    hello Ames
    hello yangbin
    hello yangbin Ames
    hello yangbin Ames
    

    列表的格式化:

    例1:

    list = ["hello", "1", "7"]
    print "%s %d-%d" % ("hello", 7, 1)
    print "%s %s:%s" % (list[0], list[1], list[2])
    print "%s" % ",".join(list)   
    
    运行结果: 
    hello 7-1
    hello 1:7
    hello,1,7
    

    例2:

    lis = ["hello", "1", "7"]
    print "{0} {1}:{2}".format("hello", "1", "9")
    print "{0} {1}:{2}".format(*lis)
    print "{} {}:{}".format("hello", "1", "8")
    print "%s %d:%d" % ("hello", 7, 1)
    print "%s %s:%s" % (lis[0], lis[1], lis[2])
    print "%s" % ",".join(lis)
    print '{0} {1}:{2}'.format(*lis)
    print "{} {}:{}".format("hello", "1", "7") 
    
    运行结果: 
    hello 1:9
    hello 1:7
    hello 1:8
    hello 7:1
    hello 1:7
    hello,1,7
    hello 1:7
    hello 1:7 
    

    字典的格式化:

    dic = {"name":"yangbin", "age":18}
    print "I am %(name)s, my age is %(age)d." % (dic)
    print "I am {name}, my age is {age}.".format(**dic)  # 推荐用法.
    print "I am {name}, my age is {age}.".format(name="yangbin", age=18)
    
    运行结果: 
    I am yangbin, my age is 18.
    I am yangbin, my age is 18.
    I am yangbin, my age is 18.
    

    文件操作:

    w: 并不是写文件时才清空文件,而是在打开文件时就会清空文件,然后等待新文件写入.
    a: 意思是读的时候,文件指针在文件开头,写时指针在文件结尾.
    
    open("path")   # 默认只读打开         
    open("path", "r+")   # 读写打开,如果有内容,就会从头到尾覆盖相应字符串的内容
    open("path", "w")   # 写入,先删除源文件再重新写入,没有文件自己创建 
    open("path", "w+")   # 读写,同上 
    open("path", "a")   # 写入,在文件末尾追加新内容,文件不存在则创建 
    open("path", "a+")   # 读写,同上,最常用。 
    open("path", "b")   # 打开二进制文件,要上述模式结合使用,读取图片 
    open("path", "U")   # 支持所有的换行符号 值
     
     
    
    

    主要用到四步:增 删 改 查.

    文件操作:

    read(NUM)  # NUM等于1时就是读取一个字节;NUM等于10时就是读取十个字节 
    read()  # 不加参数时,就是读取整个文件.  
    radline()  # 读取一行. 
    readlines()  # 将文件所有行读取到列表中,列表中每项代表一行.    
    readlines()和read()一样,将文件内容全部读取出来,当文件特别大时,会将内存占满. 
    

    文件指针: 文件读到什么位置,指针就跟着移动到该位置.

    文件指针的方法:

    tell():  查询指针所在位置.
    seek():  移动指针到指定位置.
    
    file.seek()方法标准格式是:seek(offset,whence=0)
    offset:开始的偏移量,也就是代表需要移动偏移的字节数
    whence:给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
    

    示例1:

    "red.txt"文件内容如下: 
    xiaoming:123456
    xiaoqiang:234567
    xiaowang:345678 
    
    nam = open("red.txt", "a+")
    print nam.readline()  # 每一行结尾处的"
    "(换行符)也算一个字符.
    print nam.tell()  # 查询指针所在位置.
    nam.seek(0)  # 将指针移动到文件开头第一个字节的位置.
    print nam.tell()  # 再次查询指针位置,确认指针在未见开头的位置.
    print nam.readlines()  # 将文件所有行读取到列表中
    print nam.tell()  # 此时指针在文件末尾处.
    
    运行结果: 
    xiaoming:123456
    
    17
    0
    ['xiaoming:123456
    ', 'xiaoqiang:234567
    ', 'xiaowang:345678']
    50
    

    示例2:

    file.seek()操作方法示例:
    >>> x = file('a.txt','r')
    >>> x.tell()      #显示当前游标位置在文件开头
    0
    >>> x.seek(3)     #移动3个字节,whence没有设置默认为从文件开头开始
    >>> x.tell()
    3
    >>> x.seek(5,1)   #移动5个字节,1代表从当前位置开始
    >>> x.tell()
    8
    >>> x.seek(1,2)
    >>> x.tell()
    57
    >>> x.seek(-2,2)       #表示从文件尾部开始移动指针,向后移动2个字节 
    >
    

    当读完文件后需要关闭该文件,但是close()经常容易忘记。
    所以推荐使用with:

    with open("文件名") as "要赋值的变量名":  
    

    例: 

    with open("red.txt", "a+") as f:
    print f.read() 
    
    运行结果:
    xiaoming:123456
    xiaoqiang:234567
    xiaowang:345678
  • 相关阅读:
    MVC WebApi的两种访问方法
    MVC CRUD 的两种方法
    MVC EF 导航属性
    MVC EF两种查询方法
    MVC WebApi
    POJ 1511 Invitation Cards ( 双向单源最短路 || 最小来回花费 )
    POJ 2502 Subway ( 最短路 && 最短路建图 )
    POJ 3660 Cow Contest ( 最短路松弛思想应用 && Floyd求传递闭包 )
    POJ 1502 MPI MaeIstrom ( 裸最短路 || atoi系统函数 )
    POJ 3259 Wormholes ( SPFA判断负环 && 思维 )
  • 原文地址:https://www.cnblogs.com/amesy/p/6781889.html
Copyright © 2011-2022 走看看