Python学习笔记(二)——Python数据结构

1 字符串(Strings)

  1. 函数len(str),返回str长度
  2. for循环遍历字符串,例如:
    1
    2
    3
    fruit = 'banana'
    for letter in fruit:
    print letter
  3. [n:m]来选择字符串的一个片段,包含下标为n的字符,但不包括下标为m的字符,例如:
    1
    2
    3
    4
    5
    s = 'Monty Python'
    print s[0:4] # 打印出"Mont"
    print s[6:20] # 打印出"Python",这表明可以索引过度
    print s[:2] # 打印出"Mo"
    print s[8:] # 打印出"thon"
  4. in是一个逻辑运算符,例如:
    1
    2
    3
    fruit = 'banana'
    if 'nan' in fruit:
    ...
  5. 比较运算符==><适用于字符串
  6. 函数lower():返回全部小写字符串
    函数upper():返回全部大写字符串
    例如:
    1
    2
    print aaa = 'Hello Bob'.lower() # 打印出"hello bob"
    print bbb = 'Hello Bob'.upper() # 打印出"HELLO BOB"
  7. 查询更多内置函数
    PythonLearningNote2_1
    或者访问 https://docs.python.org/2/library/stdtypes.html#string-methods
  8. 函数find(str):返回第一次出现字符串片段的位置,没有找到返回-1
    1
    print 'banana'.find('z') # 打印出“-1”
  9. 函数replace(str1,str2)
    1
    2
    3
    greet = 'Hello Bob'
    print nstr = greet.replace('Bob','Jane') # 打印出“Hello Jane”
    print nstr = greet.replace('o','X') # 打印出“HellX BXb”
  10. 函数strip():移除字符串首尾的空白(包括空格、制表符和换行符)
    1
    2
    3
    4
    greet = '   Hello Bob  '
    print greet.lstrip() # 打印出“Hello Bob ”
    print greet.rstrip() # 打印出“ Hello Bob”
    print greet.strip() # 打印出“Hello Bob”
  11. 函数startwith(str)
    1
    2
    3
    line = 'Please have a nice day'
    line.startwith('Please') # 返回True
    line.startwith('p') # 返回False

    2 文件(Files)

  12. 函数open()handle = open(filename,mode),其中mode默认为r
    注意:需要把文件和python代码放在同一个文件夹里
    1
    2
    3
    4
    5
    6
    7
    fhand = open('mbox.txt')
    # 按行读取文本
    for line in fhand:
    print line # 读取文件的每一行
    # 读取整个文本
    inp = fhand.read() # 将文件一次性读取
    print len(inp) # 打印出文件mbox.txt总计字符数

    3 列表(Lists)

  13. 列表的元素不要求是同一类型的。
    列表可以嵌套列表。
  14. 函数range(int):生成列表,例如:
    1
    print range(4) # 打印出“[0,1,2,3]”
  15. 利用+连接两个列表,例如:
    1
    2
    3
    4
    a = [1,2,3]
    b = [4,5,6]
    c = a + b
    print c # 打印出“[1,2,3,4,5,6]”
  16. 函数append(元素):在列表的末尾增加一个元素,例如:
    1
    2
    3
    stuff = list() # 生成一个空列表,等价于“stuff = []”
    stuff.append('book')
    print 'book' in stuff # 打印出“True”
  17. 函数pop():取出列表中指定下标的元素(默认为最后一个),例如:
    1
    2
    3
    4
    5
    lst = [1, 82, -6, 4, 3, 8]
    print lst.pop() # 打印出“8”
    print lst # 打印出“[1, 82, -6, 4, 3]”
    print lst.pop(3) # 打印出“4”
    print lst # 打印出“[1, 82, -6, 3]”
  18. 函数sort():将列表本身从小到大排序,例如:
    1
    2
    3
    nums = [3,41,12,9]
    nums.sort() # 将列表nums排序
    print nums # 打印出“[1,9,12,41]”
  19. 列表的一些内置函数
    1
    2
    3
    4
    5
    6
    nums = [3,41,12,9,74,15]
    print len(nums) # 打印出“6”
    print max(nums) # 打印出“74”
    print min(nums) # 打印出“3”
    print sum(nums) # 打印出“154”
    print sum(nums)/len(nums) # 打印出“25”
  20. 函数split():把一个字符串分成单独的单词列表,并且把原字符串中的空白字符丢掉。split()函数有一个可选参数,可以指定特定字符作为单词之间的界限。
    函数list():把一个字符串分成字符列表
    1
    2
    3
    4
    5
    6
    7
    abc = 'With three words'
    stuff1 = abc.split()
    print stuff1 # 打印出“['With','three','words']”
    # 有参数的split()
    bcd = 'With;three;words'
    stuff2 = bcd.split(';')
    print stuff2 # 打印出“['With','three','words']”
  21. 列表的引用
    例:
    (a)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # List reference problem
    a = [5, 3, 1, -1, -3, 5]
    b = a
    b[0] = 0
    print a
    print b
    ###################################################
    # Result

    # [0, 3, 1, -1, -3, 5]
    # [0, 3, 1, -1, -3, 5]
    ###################################################
    # Explanation

    # The assignment b = a created a second reference to a.
    # Setting b[0] = 0 also mutated the list that both
    # a and b reference. As a result, a[0] == 0.

    # See the Programming Tips videos for a more detail
    # explanation and examples
    (b)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # List reference problem
    a = [5, 3, 1, -1, -3, 5]
    b = list(a)
    b[0] = 0
    print a
    print b
    ###################################################
    # Result

    # [5, 3, 1, -1, -3, 5]
    # [0, 3, 1, -1, -3, 5]
    ###################################################
    # Explanation

    # The assignment b = list(a) created a copy of the list a.
    # Setting b[0] = 0 only mutated the copy of the list, not
    # the original list. As a result, a[0] == 5.
  22. 函数index():返回元素在列表中的下标。例:
    1
    2
    lst = [1, 82, -6, 4, 3, 8]
    print lst.index(8) # 打印出“5”
  23. 在遍历一个 list 时,千万不要从里面删除东西,如果需要删除东西,记录下你想要删除的东西,并随后删除它们。例:
    1
    2
    3
    4
    5
    6
    7
    8
    # 删除列表 numbers 中的所有奇数
    numbers = [1, 7, 2, 34, 8, 7, 2, 5, 14, 22, 93, 48, 76, 15, 7]
    def remove_odd(numbers):
    for num in numbers:
    if num % 2 == 1:
    numbers.remove(num)
    remove_odd(numbers)
    print numbers
    运行结果为:
    [2, 34, 8, 7, 2, 14, 22, 48, 76, 7]
    这将导致 Python 运行混乱解决方案:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # remove_odd3将要删除的元素放在一个列表中,在循环后删除它们
    def remove_odd3(numbers):
    remove = []
    for num in numbers:
    if num % 2 == 1:
    remove.append(num)

    for num in remove:
    numbers.remove(num)

    # remove_odd4将要保留的元素放在一个新的列表中,从而代替原来的列表
    def remove_odd4(numbers):
    newnums = []
    for num in numbers:
    if num % 2 == 0:
    newnums.append(num)
    return newnums
    另:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # remove_odd2的错误是:当列表删除一个元素后,该元素后面的所有元素的下标都会减 1(即向前一位),而不是不变
    def remove_odd2(numbers):
    remove = []
    for num in numbers:
    if num % 2 == 1:
    remove.append(numbers.index(num))

    for idx in remove:
    numbers.pop(idx)

4 字典(Dictionaries)

  1. 字典是无序的(列表是有序的)。例如:
    1
    2
    3
    4
    5
    ddd = dict()
    ddd['age'] = 21
    ddd['course'] = 182
    print ddd
    # 可能打印出“{'course':182,'age':18}”,可能打印出“{'age':18,'course':182}”
  2. 函数get(键,默认值):如果键出现在字典中,那么它会返回此键对应的值。 如果键不在字典中, 返回事先给定的默认值。 例如:
    1
    counts[name] = counts.get(name,0) + 1
  3. for循环遍历字典,例如:
    1
    2
    3
    counts = {'chuck':1, 'fred':42, 'jan':100}
    for key in counts:
    ···

    5 元组(Tuples)

  4. 元组是不可变的(和字符串相似)。
  5. 构造临时变量的时候,元组比列表更合适。
  6. 元组可以出现在赋值语句的左侧。当左侧是一个序列时,一次可以为多个变量赋值。
  7. 函数items():将字典转化为元组的列表。例如:
    1
    2
    3
    4
    5
    6
    7
    d = dict()
    d['cwen'] = 4
    d['csev'] = 2
    tup = d.items()
    print tup # 打印出“[('cwen',4),('csev',2)]”
    tup.sort() # 根据键排序
    print tup # 打印出“[('csev',2),('cwen',4)]”
  8. 比较运算符适用于元组。Python从每个序列的第一个元素开始比较,如果它们相等,继续比较下一个元素,以此类推,直到找到不同的元素。
  9. 函数sorted():根据排序,但不改变原始的序列。例如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> d = {'a':10, 'b':1, 'c':22}
    >>> d.items()
    [('a', 10), ('c', 22), ('b', 1)]
    >>> t = sorted(d.items())
    >>> t
    [('a', 10), ('b', 1), ('c', 22)]
    >>> for k, v in sorted(d.items()):
    ... print k, v
    ...
    a 10
    b 1
    c 22
  10. Sort by values: 构造一个元组的列表,每项为(value,key),然后排序。
    • 方法一。例如:
      1
      2
      3
      4
      5
      6
      c = {'a':10, 'b':1, 'c':22}
      tmp = list()
      for k, v in c.items():
      tmp.append((v, k))
      tmp.sort(reverse=True)
      print tmp # 打印出“[(22, 'c'), (10, 'a'), (1, 'b')]”
    • 方法二(Even shorter version)。例如:
      1
      2
      c = {'a':10, 'b':1, 'c':22}
      print sorted([(v, k) for k,v in c.items()]) # 打印出“[(1, 'b'), (10, 'a'), (22, 'c')]”