1. Tuples

tuples和lists很相似,但是它们的元素是固定的,一旦一个tuple被创建,那么就不能执行添加元素、删除元素、修改元素、或者对元素进行排序等操作(但注意可以对一个tuple重新赋值)。看到这里,不禁会疑问,既然tuple什么都不能做,干嘛还要用它,tuple的存在可能基于两个原因:1)在python中,它比list操作速度更快,如果我们定义一个常量集,不需要修改,只需要遍历,则最好用tuple;2)安全性:由于tuple不能进行修改,那么对于这种类型的数据,tuple可以避免数据被偶然修改。

tuple用()创建,可以直接创建,如t1 = (1,3,5); 也可以从list创建,如t2 = tuple([2 * x for x in range(1,5)]); 另外还可以从string创建,如t3 = tuple("abcd") # t3: ('a','b','c','d')。

同时tuple也可以进行len(),max(),min(),sum(),index(),slicing等操作。如下所示:

tuple1 = ("green","red","blue")
tuple2 = tuple([7,1,2,23,4,5])
print (len(tuple2)) # 6
print (max(tuple2)) # 23
print (min(tuple2)) # 1
print (sum(tuple2)) # 42
print (tuple2[0])   # 7
tuple3 = 2 * tuple1
print (tuple3)     # ('green', 'red', 'blue', 'green', 'red', 'blue')
print (tuple2[2:4]) # (2, 23)
print (tuple1[-1])  # blue
for v in tuple1:
    print (v,end=' ')   # green red blue
print ()
print (tuple1==tuple2)   # False



2. Sets

Set和list也有相似之处,可以用来存储数据,但和list有三点不同:1)set中无重复元组,这可以用来做很多事情,如在decision tree的程序中,用来取某一属性上的所有值,则可以在取得属性上值的list后,做set(list)操作,则去除了重复值; 2)set和list与tuple不同,它是无序的,所以如果你所需要存储的数据不需要顺序,则用set会比list要高效。3)另外,set中的元素必须是可hash的,而list却没有这个要求,目前为止除了list,其它类型都是必须可hash的。

set的创建用{}表示,也可以用set()构造函数创建,如set1 = {1,3,5}; set2 = set([2*x for x in range(1,5)]); set3 = set("abcd")。

set的操作函数:

add(e):添加一个元素e;

remove(e):删除一个元素e;

max(),min(),len(),sum():常用的几种操作;

s1.issubset(s2):判断s1是否是s2的子集;

s1.issuperset(s2):判断s1是否是s2的父集;

==,!=:判断两集合是否相同;

<, <=, >, >=:判断子集与父集;

s1.union(s2)或者|:两集合的并;

s1.intersection(s2)或者&:两集合的交;

s1.difference(s2)或者-:两集合的差。

s1.symmetric_difference(s2)或者^:两集合的异或。

下面对上面的函数举个小例子:

s1 = {1,2,4}
s1.add(6)
print (s1)        # {1,2,4,6}
print (len(s1))   # 4
print (max(s1))   # 6
print (min(s1))   # 1
print (sum(s1))   # 13
print (3 in s1)   # False
s1.remove(4)  
print (s1)        # {1,2,6}

s1 = {1,2,4}
s2 = {1,4,5,2,6}
print (s1.issubset(s2))    # True
print (s2.issuperset(s1))  # True
print (s1==s2)             # False
print (s1<=s2)             # True

print (s1.union(s2))       # {1,2,4,5,6}
print (s1|s2)              # {1,2,4,5,6}

print (s1.intersection(s2))# {1,2,4}
print (s1&s2)              # {1,2,4}

print (s1.difference(s2))  # set()
print (s1-s2)              # set()

print (s1.symmetric_difference(s2))  # {5,6}
print (s1^s2)                        # {5,6}

set 在in 和not in以及在remove()操作上比list要高效。

3. Dictionary

dictionary是采用键值对来对数据进行存储,它可以很快的实现基于key的检索,删除,更新等操作。key很像索引,也必须是可hash的。并且,dictionary中不能包含相同的key值。

dictionary的创建也是用{},和set相同,所以,默认情况下,我们创建set的时候采用set(),而把{}留给dictionary,比如student={},我们可以默认是创建dictionary的;创建的例子:

students = {"111-58-5858": "John", "132-59-5959": "Peter"}

dictionary的一些函数操作:

add : 可以用dictionaryName[key] = value来操作; 如果这个key已经在dictionary中存在了,那么则进行修改操作;而且,我们可以用dictionaryName[key]来读取某个item值;

delete:用del dictionaryName[key]做删除操作;

loops:用for key in students: 这种形式做循环操作;

len():返回dictionary的大小,共有多少个键值对;

in :查看某key是否在dictionary中;

==:判断两dictionary是否包含相同的内容;

keys():返回dictionary中的所有key;

values():返回所有的值;

items():返回所有的内容,以键值对的tuple形式显示;

clear():删除所有内容;

get(key):获取键为key的值;

pop(key):删除键为key的项,并返回其值;

popitem():随机删除一个项,并返回其内容;

下面对这些函数举简单例子:

students = {"111-58-5858":"John", "132-59-5959":"Peter"}

# add
students["234-56-9010"] = "Susan"
# modify
students["111-58-5858"] = "Smith"
# 检索
print (students["111-58-5858"])    # Smith
# 删除
del students["234-56-9010"]
# 循环
for key in students:
    print (key + ":" + students[key])    # 111-58-5858:Smith  132-59-5959:Peter
# len
print (len(students))  # 2
# in, not in 
print ("111-58-5858" in students)  # True
print ("111" not in students)      # True
# ==, !=
d1 = {"red":22, "blue":2}
d2 = {"blue":2, "red":22}
print (d1==d2)   # True
print (d1!=d2)   # False

#keys()
print (tuple(students.keys()))   # ('111-58-5858', '132-59-5959')
print (tuple(students.values())) # ('Smith', 'Peter')
print (tuple(students.items()))  # (('111-58-5858', 'Smith'), ('132-59-5959', 'Peter'))
print (students.get("111-58-5858"))  # Smith
print (students.pop("111-58-5858"))  # Smith
print (students.popitem())           # ('132-59-5959', 'Peter')