集合对象
任何一门语言的集合对象都是重中之重,一般包括固定数组,可变数组,字典 (hashtable),还有其他一些特殊集合,.net里System.Collection以 System.Collection.Specialize下的类,Java中Java.util.Collections包中的类就是与此相关.另外, 这两种环境中的数组都为固定长度数组,但是也同时提供可变长度的列表类ArrayList(两种环境都叫这个名字).
而php中,数组和字典混合了起来,也就是说,即可以通过顺序方式访问,也可以为数组的每个元素设置一个key
那么python里面的集合类是怎么使用又具有什么特点呢?
Lists(列表类):
这个类可以类比为.Net和java中的ArrayList,是一个可变长度,没有类型约束的数组;
-
创建列表对象
myTags=['a','aa','b','A','啊'],这个语句创建了一个列表对象,并赋予了初始值,注意这里初始值用中括弧[]括起来,后面还有其他的集合类型,他们的符号稍微不同,千万小心
-
添加删除修改元素
下面的语句往刚刚初始化的数组中添加一个整数类型的对象
myTags.append(0),这个语句吧0这个整数加入到列表中去
与之对应的删除一个元素的方法为Remove,比如下面语句把内容为b的元素删除
myTags.remove('b'),注意如果list中有两个内容为b的元素,remove方法会删除序号小的那个,而如果列表中么有内容为"b"的元素,那么会报错
myTags[0]="abc",把这个列表的第一项修改为"abc",注意这里数组还是从0开始,而不像VB和Fortran(没听说过?有代沟...)是从1开始的.
-
打印列表内容
打印这个列表的方法非常简单
print myTags
输出结果为:
['a', 'aa', 'b', 'A', u'\u554a',0]不用进行任何循环,呵呵,方便吧,更强大的功能还在后面
-
对列表进行排序
我们还可以为对list对象进行排序,
myTag.sort()
上面的语句执行结果是
>>> print myTags
[0, 'A', 'a', 'aa', 'b', u'\u554a']可以看出排序是按照ascii码表的对应顺序来的,中文被转化为unicode表示显示并排在最后,.net和java里都有这个功能,实现各有不同,参看下面的翻转列表
- 反转列表
通过myTags.reverse()这个方法,我们就可以把列表翻转,再次打印,输出结果为
[u'\u554a', '{', 'b', 'aa', 'a', '\\', 'A', 0]
这个方法.net的ArrayList也有提供,而java中用通过Collection类的reverse静态方法操作一个集合对象来实现如 ArrayList list=new ArrayList(),Collection.reverse(list),这个类同时也提供了排序,获得最大/小值,拷贝,循环等等方法,但是这个实用的类却常常被忽略,呜呼哀哉!
- 其他方法 list类还有学多方法,包括用count属性查看列表长度,pop弹出指定位置的数据,我们就不一一讲解了,有兴趣的可以通过dir命令查看List对象具有的方法
Tuple(不变列表)
这个类的名称对.Net和Java的程序员很不直观,没有对应的名词,但是他的概念其实很简单,即一旦创建就不能改变,虽然Tuple没有公开的方法来增加元素,但是通过一些内置方法,我们仍然可以做到这点
- 创建Tuple
myTuple=('Field','Method','Class') 是不是很类似于.net中数组的声明和初始化string[] myTags ={ ".Net", "DataBase", "Python" };
注意这里用原括弧(),而不是中括弧,也不是.net中申明数组的大括弧{} - Tuple在输出语句中的用法
print '%s is %d years old' % (name, age),这个语句把姓名和年龄按照顺序填到字符串的置顶位置,然后输出,用过c语言的人对%s,%d肯定不陌生,一个置顶内容为字符串,一个指定内容为数字.后面那个%d也可以写成s%,实际上所有的情况你都可以写成%s,让python自己来搞定转换工作,但是写出正确的类型可以杜绝下面的情况,比如你的程序有错误,不小心往年龄里添了个字符串,这是运行到这里代码就报错了.
.net里面实现这个功能类似的语法是这样来做 Console.WriteLine("'{0} is {1} years old",name,age),可以看到.net要灵活一些,后面的name和age不一定要按照顺序给出,比如Console.WriteLine ("'{1} is {0} years old",age,name)和上面的语句有同样的效果