教你使用Python集合
定义集合 集合就像篮子, 你可以放进和取出东西, 可以是同一类的东西, 也可以是不同类的。 基本上, 它是个让你收集东西的存储结构。 比如你有一个车的类型(car) ,创建了几种车,想把这些车放在一起又容易找到,就是运用 集合非常好的场景。 集合存在于内存中。你不需要创建集合或者任何架板,这些都是现成的。只要有个变量就可 以往里面放车子了。完了之后你就可以根据名字或者索引(在集合中的参数)把他们取出。 ython 提供了许多自建类型归属于集合类,但是没有一个叫 collection 的类型,他们是 lists, mappings,和 sets。
list
列表:list 是 Python 内置的一个数据类型。list 是可变的允许添加同一类型或不同类型的元 素,类似于其他语言中的指针。 下面的例子是创建列表并添加元素:
alist = ["item1", "item2", 4]
注意这个列表成分混杂,包含了字符串和整数类型。 要取回列表中的元素,只需引用该元素的索引序号。Python 列表序号是从零开始的,如果 我要最后一个元素,它是第 3 位,我需要用 2 来索引:
alist[2] > 4
系统返回了 4。取列表中的元素时,只要从它的位置减去 1 就得到正确的索引序号。 检查列表长度用 len 命令:
len(alist)
> 3
向列表添加元素用 append()函数:
alist.append(False) len(alist) > 4
我们增加了一位列表长度,添加了一个数据类型—布尔类型。列表并没有表示任何不满。 我们可以调用 remove()移除列表元素:
alist.remove("item2")
remove()没有返回参数,列表会被更新,现在它包含三个元素:
['item1', 4, False]
有几种方法将元素从列表中取出。我们前面说过用索引访问元素,如果我访问索引 2,将会 得到元素 3。
thevalue = alist[2] print(thevalue) > False
上面的代码为我们复制了元素,元素还在列表中,列表的长度不会受到影响。 然而我们用 pop(), 在得到元素的同时将元素移除了列表:
thevalue = alist.pop(1) print(thevalue) > 4 print("after pop", alist)
> ['item1', False]
列表也可以被排序,我们有包含字符串的列表:
alpha = ["z", "b", "a", "c"]
你可以用 sort()命令来排序:
alpha.sort()
没有返回值,但 alpha 已经被排序了,你可以打印出来看看:
print(alpha) ['a', 'b', 'c', 'z']
元素可以被反序排列,只需引用 reverse():
alpha.reverse
字符串是列表吗?
字符串与列表有很多相似之处,但字符串是不可改动的,而列表可以随意修改。 字符串可以向列表一样索引。你可以像数列表中元素一样数出字符串中的字符。 比如:
mystring = "The quick brown fox." print(len(mystring )) > 20 print(mystring[4]) > q
和列表不一样的是你不能追加字符,也不能更改字符串中特定位置字符。 我们看一下给特定位置分配字符会出现什么情况:
mystring[4] = 'z' > TypeError: 'str' object does not support item assignment
根据字符串,可以将它转化成列表。取上面用到的 mystring 变量,我们用 split(),它会在空 格断开:
stringlist = mystring.split() stringlist > ['The', 'quick', 'brown', 'fox.'] type(stringlist) > <class 'list'>
每个单词都变成了列表中的元素,我们也清楚的看到类型变为列表。 如果字符串没有空格我们也可以转换,但结果如何呢,看看吧:
mystring2 = "Thequickbrownfox." stringlist2 = mystring2.split() stringlist2 > ['Thequickbrownfox.'] type(stringlist2) > <class 'list'>
我们还是得到了一个列表,单只有一个元素。在这个例子中,这个转换没有多大用处。
mappings
mapping 也是内置类型,只在字典中使用。字典是键/值对应的,不同于列表,我们不用序号 索引,代之的是字典的键(key)。 类似列表创建字典用键/值成对而不是单一元素,给个例子:
mydictionary = {"item1":45, "item2":76, "item3":145}
每个键/值用冒号分开,前面是键后面是值。在第一个元素中,item1 是键,45 是值。同时 注意我们用大括号来包住元素。 当从字典中取元素时,序号不可用了,那我们就该想到键。如果要 item2,我们这样做:
mydictionary["item2] > 76
和列表一样,可以查看字典的长度:
len(mydictionary) > 3
改变 item2 的值,可以直接给他赋值:
mydictionary["item2] = 100
增加元素也是直接赋值:
mydictionary["item62"] = 433
item62 现在就存在于字典了,字典长度加 1。 根据键可以删除字典元素:
del mydictionary["item2"]
前面提到字典是键/值成对出现,如果我们只要键可以这样做:
mydictionary.keys() > dict_keys(['item3', 'item1', 'item62'])
访问值也是同样的方法:
mydictionary.values() > dict_values([145, 45, 433])
Sets
set 是无序的集合,不能有重复的元素,也不能排序,sort()是不能使用的。 同列表相比 set 验证元素是否存在会更快。 创建一个 set:
myset = {3, 4, 5, 1}
或者用 set 语句来转化已存在的类型:
multistory = [0,1,5,4,3,7,6,6] myself = set(multistory) > {0,1,3,4,5,6,7}
因为 set 只能包含唯一的元素, 所以重复的 6 被移除了。 从已有数据创建唯一元素集合, set() 是个非常好的方法。 如果我试图让移除的 6 回来,它是不会理会的:
myself.add(6) > {0, 1, 3, 4, 5, 6, 7}
要移除 set 中元素需要用 remove():
myself.remove(4)
set 也不支持索引,用序号来访问,它会返回错误:
myset[2] >TypeError: 'set' object does not support indexing
set 有些独有的方法,如果你熟悉 set 的数学方法(difference,intersection 和 union),会很 好用。 我们从 difference 开始,假设我有两个 set:
set1 = {1,3,6,7} set2 = {1,3,6,8,10}
用 set1 和 set2 做 difference 会得到 7,7 在 set1 而不在 set2。
set1.difference(set2) > {7}
反过来用 set2 和 set1 做对比:
set2.difference(set1) > {8, 10}
也可以来找它们的相同部分:
set.intersection(set2) > {1, 3, 6}
最后来看把它们合并起来形成一个新的 set:
set3 = {set1.union(set2) > {1, 3, 6, 7, 8, 10}
新的 set 包含它们两个中所有元素。
总结
我们看过了 list,string(虽然不属于集合),dictionary 和 set。学习了它们所有的特定运算 和独有功能。希望这个介绍可以让你对 Python 的集合多点认识。
|
|