Dec 24, 2010

python 容器, 序列 (str, list, tuple, etc), dict, set

python 提供了如下 containers
  1. 内建的 containers: dict, list, set, and tuple
  2. 'collections' 模块中的 container: Counter, deque, OrderedDict and defaultdict, and one datatype factory function, namedtuple().
一些内建的 containers
  • " "         str
  • [ ,   ]     list
  • ( ,   )     tuple
  • { ,   }    set
  • { : ,  }   dict
container 一般支持如下操作(以 set 为例)
x in setlen(set), and for x in set

container 又有特殊的子类 sequence
Python 3.0 sequence type 共有六种
  • str
  • bytes
  • bytearray
  • list
  • tuple
  • range
sequence 可以分为
  • Immutable sequences (cannot change once it is created):str, bytes, tuple
  • Mutable sequences: bytearray, list
Sequences 可以使用的操作

Operation Result
x in s True if an item of s is equal to x, else False
x not in s False if an item of s is equal to x, else True
s + t the concatenation of s and t
s * n, n * s n shallow copies of s concatenated
s[i] i‘th item of s, origin 0
s[i:j] slice of s from i to j
s[i:j:k] slice of s from i to j with step k
len(s) length of s
min(s) smallest item of s
max(s) largest item of s
另外两个操作:
for i in seq:
    expression

it = iter(seq)
it.next() 
    序列赋值,或称为 Sequence unpacking
    语法为 comma separated list = sequence,注意左值个数必须等于序列的长度。这种操作也支持 iterator
    x,y=[1, 2]
    x,y="xy"
    x,y=(1,2)

    it = iter("ab")
    a,b = it

    '\n'.join(seq) 将 string 元素组成的 sequence 展开成一个string (seq 中不能包含非string元素)
    >>> s="I love you!"
    >>> s.split()
    ['I', 'love', 'you!']
    >>> print('\n'.join(s.split()))
    I
    love
    you!
    
    FOR 的魅力

    for item in sequence_of_item [if expr(item)]:
      expression
    
    例如:
    for i in range(N): #0-N-1
    
    for i in range(len(seq)):
      expression(seq[i])
    
    注: item 的形式必须和在 sequence 中形式一致,如果 item 也是一个 sequence,则可以使用 sequence unpacking 规则。
    >>> li=[(1,2),(3,4)]
    >>> for i in li:
     print i
    
     
    (1, 2)
    (3, 4)
    >>> for i,j in li:
     print i
    
     
    1
    3
    
    >>> week = {"monday":1,"tuesday":2}
    >>> week.items()
    [('tuesday', 2), ('monday', 1)]
    >>> for day in week.items():
    print day
    
    
    ('tuesday', 2)
    ('monday', 1)
    >>> for day, number in week.items():
    print day
    
    
    tuesday
    monday
    >>>
    

    除了 for in,还有 if...in... 判断 item 是否在 sequence 里面
    >>> if 'i' in 'illl':
     print 'OK'
    
     
    OK
    >>> 
    

    sequence 相互转化
    string 可以通过 list(), tuple() 转化为 list, tuple。list 和 tuple 之间也可以通过这两个函数相互转化。

    indexing
    Dictionary 和 sequence 的 indexing 都用 [],但是 dictionary 的下标是 key,而 sequence 的下标是数字,从0开始,假设有n个元素,则 n 表示结尾位置,而 -1 表示最后一个元素位置,slicing 时左闭右开,[0:n] 为所有元素,[0,-1]则缺少最后一个元素。

    接下来说说每类 container 该注意的地方。


    dict
    dict (dictionary): 相当于 STL 的 map {key:value}

    dictionary 可以用于格式化字符串,用类似 %(key)s 来替换
    line = """hi %(name)s,
      you donated $%(amount)d. Thanks.  
    """
    dict = {'name':'kevin','amount':50};
    
    print line%dict
    

    dict 的几个函数
    >>> d = {'ab':'word','cd':'air',12:34}
    >>> 'ab' in d
    True
    >>> 12 in d
    True
    >>> d[12]
    34
    >>> d['cd']
    'air'
    >>> d.get(12)
    34
    >>> d.keys()
    ['ab', 12, 'cd']
    >>> d.values()
    ['word', 34, 'air']
    >>> d.items()
    [('ab', 'word'), (12, 34), ('cd', 'air')]
    
    dict 遍历
    for key in dict # 相当于 for key in dict.keys()
    所以
    for key in dict:
    use key and dict[key]
    或者
    for key,value in dict.items():
    use key and value

    list
    list append 和 extend 的区别
    • append adds a single element to the end of the list.
    • extend concatenates lists. Its argument is a list.
    str
    str 是 unicode 序列, 但是在写文件时,默认是 ASCII 和 unicode 混合。比如 file.write("abc我们"),则 abc 为 ASCII, 我们 为 unicode。
    bytes, bytearray 是字节(0-255)序列,在 referencing 时是 0-255 数字,在 slicing 时是bytes(/bytearray?)序列,二者是不相等的。
    str 和 bytes 可以显式转化,但不等同,所以需要 str 的地方不能用 bytes,反之亦然。
    >>> s=b"abc"
    >>> s[0]
    97
    >>> s[:1]
    b'a'
    >>> 97==b'a'
    False
    
    二进制方式打开文件时不能输入 str.

      u"This is unicode string" 以 u 开头的字符串是 unicode 字符串。它不能用 print 打印,要使用成员函数 encode.
      Python 3.0 取消了这种方式,因为 str 就是 unicode 序列。

      0 comments: