Python科学计算与数据处理5:数据类型之非数值类型

python-dictionary.jpg

上一节主要介绍了数值类型及其相关函数,这一节将介绍非数值类型,包括:字符、元组、列表和字典。

字符串

Python中的字符串是一个包含零个或多个字符的序列,因此它既包括了空字符,也包括了单个字符。字符串的定义方法我们之前已经介绍了,你可以通过len()函数来查看字符串的长度:

s1 = 'magpie bridge'; s2 = ''
print len(s1), len(s2)

输出为:

13 0

字符串索引

字符串采用下标[]的方式进行索引。例如

name = 'Monty Python'
len(name), name[0], name[11], name[-1], name[-3]

输出为:

 (12, 'M', 'n', 'n', 'h')

下标可正可负,但是不能超过其长度范围,注意下标的起始值是0,而不是1。参考下图:

string_index.jpg

我们可以看到,对于一个长度为12的字符串,其下标范围是0~11,或-1~-12。也可以使用切片(slice)操作来一次性索引多个下标:

# 下面两种索引方法效果一样
name[0:3], name[:3]

注意索引的时候,[0:3]指的是第0、1、2个元素,而不包含第3个元素。

# 利用负下标进行索引,注意第二个表达式不会包含最后一个元素(第-1个元素)
name[-5:], name[-5:-1]

输出为:

('ython', 'ytho')

也可以指定步长,比如要索引第0、2、4个元素,可以使用下面任何一个表达式

name[0:5:2], name[0:6:2], name[:5:2]

输出为:

('Mny', 'Mny', 'Mny')

也可以利用负的步长从后向前倒序索引

name[-1:-5:-1]

输出为:

'noht'

切片操作是Python中对序列元素进行索引最常用的方法,对于字符串、列表和元组等都是可以使用。

字符串方法

字符串作为一个实例,提供了许多有用的方法。关于实例方法具体是什么,会在介绍类的时候进行讲解,在这里你可以先将方法理解为一个函数。比如我们定义一个字符串,并统计其中出现了多少个't',可以使用count()方法;如果要知道这个元素第一次出现时的下标,可以用index()方法:

name = 'Monty Python'
name.count('t'), name.index('t')
(2, 3)

或者我们希望找到某个元素的下标是多少,用find()函数会返回这个元素第一次出现的下标,如果这个元素不存在于字符串中,那么返回-1

name.find('t'), name.find('Py'), name.find('w')
(3, 6, -1)

下面我们介绍几种特别有用的字符串方法。

大小写

name = 'david CHRISTOPHER'
print name.upper()     # 全部大写
print name.lower()     # 全部小写
print name.swapcase()  # 交换大小写
print name.title()     # 每个单词首字母大写
DAVID CHRISTOPHER
david christopher
DAVID christopher
David Christopher

字符串修剪(strip)

name = '  There are some extra spaces  '
print r'original----%s----' % name
print r'rstrip()----%s----' % name.rstrip()  # 清除右侧空格
print r'lstrip()----%s----' % name.lstrip()  # 清除左侧空格
print r' strip()----%s----' % name.strip()   # 清除两侧空格
original----  There are some extra spaces  ----
rstrip()----  There are some extra spaces----
lstrip()----There are some extra spaces  ----
 strip()----There are some extra spaces----

分解字符串(split)

date = '2019-01-05'
date.split('-')
['2019', '01', '05']

连接字符串(join)

date = ['2019', '01', '05']
'-'.join(date)
'2019-01-05'

替换元素(replace)

sentence = 'Time is great and time is money.'
print sentence.replace('is', 'was')
print sentence.replace('is', 'was', 1)
Time was great and time was money.
Time was great and time is money.

布尔方法

str1 = 'abcd'; str2 = '1234'; str3 = 'abcd1234'; 
str4 = 'abcd*%232'; str5 = '   '; str6 = 'ABC'
print str1.isalpha()   # 判断字符串是否全部由字母构成
print str2.isdigit()   # 判断字符串是否全部由数字构成
print str3.isalnum()   # 判断字符串是否全部由字母或数字构成
print str4.isalnum()
print str5.isspace()   # 判断字符串是否全部由空格构成
print str6.isupper()   # 判断字符串是否全部由大写字母构成
True
True
True
False
True
True

字符串函数

前面介绍了字符串方法,下面我们来介绍Python自带的字符串相关函数,这些函数大多数不仅可以接受字符串作为实参,往往也可以接受列表和元组等作为实参。

最大最小值

str1 = 'abcdefg'; a = [1, 2, 3]
min(str1), max(str1), max(a)
('a', 'g', 3)

类型

type(str1), type(a)
(str, list)

元组

元组是一种序列,可以混合存放不同类型的数据。元组用圆括号()来标识,在定义时也可以省略圆括号:

tup1 = (1, 2, 3.5, 'hello', 'a')
tup2 = 1, 2, 3.5, 'hello', 'a'
tup1, tup2
((1, 2, 3.5, 'hello', 'a'), (1, 2, 3.5, 'hello', 'a'))

索引和元素提取(unpack)

对元组中元素的索引,与字符串操作类似,也是按下标进行索引,也可以进行切片操作。

tup1 = ('Li Jing', 'Guo Ziyi', 'Li Shuo', 'Gao Xianzhi')
tup1[-1:-3:-1]
('Gao Xianzhi', 'Li Shuo')

可以将元组中的元素赋值给其他变量,但是要注意,所赋值的变量数目必须等于元组的长度。

tup1 = (1, 2, 3, 4)
a, b, c, d = tup1
print a, b, c, d
1 2 3 4

元组方法和函数

元组实例只有2个方法,即count()index(),它们和字符串的相应方法一样。前面介绍过的字符串函数,大都也可以用于对元组进行操作,例如len()max()min()等,使用方法也一样。

元组运算

元组和字符串都可以进行两种运算,即+*,其中+运算是将两个元组或字符串合并,而*运算是将元组或字符串重复一定的次数并组成新的元组或字符串。

tup1 = (1,2,3); tup2 = (1,'a', 'b')
s1 = 'abcd'; s2 = '2345'
print tup1 + tup2, tup1*2
print s1 + s2, s1 * 2
(1, 2, 3, 1, 'a', 'b') (1, 2, 3, 1, 2, 3)
abcd2345 abcdabcd

注意

元组相对于我们后面要讲的列表有一个重要的特点,那就是元组是不可更改的,也就是一旦被赋值,那么不能够通过索引来修改它的元素,或者增加删除元素。如果强行修改,系统会提示TypeError错误。

tup1 = (1, 2, 3, 4)
tup1[1] = 9
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-299-0955b7e84275> in <module>()
      1 tup1 = (1, 2, 3, 4)
----> 2 tup1[1] = 9


TypeError: 'tuple' object does not support item assignment

列表

列表使用中括号[]来定义,也是一种序列。列表的使用基本和元组类似,但是如前所述,元组的元素不可更改,但是列表则可以通过索引修改任意元素。因此,列表具有更加灵活的应用,它所对应的方法更丰富。列表的创建、索引和元素提取都与元组类似,这里不在赘述,我们将重点介绍列表不同于元组的一些特性。

names = ['Li Jing', 'Gao Xianzhi', 'Li Shuo', 'Guo Ziyi']
names[0], names[-1]
('Li Jing', 'Guo Ziyi')

更新列表

可以通过索引更新列表的元素:

fruits = ['apple', 'banana', 'melon']
print fruits
fruits[0] = 'avocado'
print fruits
fruits[1:] = ['cherries', 'pear']
print fruits
['apple', 'banana', 'melon']
['avocado', 'banana', 'melon']
['avocado', 'cherries', 'pear']

也可以通过del()函数来删除列表中的某个元素,例如:

fruits = ['apple', 'banana', 'melon']
del fruits[0]
print fruits
['banana', 'melon']

成员判断(in)

可以用Python关键字in来判断某个值是否存在于列表中,这是一个特别有用的功能,例如:

fruits = ['berries', 'cherries', 'pear']
a = 'cherries'; b = 'pomegranate'
print a in fruits
print b in fruits
True
False

列表函数

之前介绍的对字符串和元组操作的函数同样可以操作列表,这里给大家介绍有个非常有用的排序函数sorted(),它同样可以操作各种序列,但无论它操作的是什么序列,其返回值都是列表:

str1 = 'CAT'; lis1 = [3,1,6,2]; tup1 = ('d', 'b', 'c', 'a')
print sorted(str1), sorted(lis1), sorted(tup1)
['A', 'C', 'T'] [1, 2, 3, 6] ['a', 'b', 'c', 'd']

列表方法

相比于元组,列表的方法更多:

  • count
  • index
  • append
  • extend
  • insert
  • remove
  • pop
  • reverse
  • sort

其中前两个方法与元组的方法类似,我们将简要介绍其他方法。

append()

用于向列表添加元素,新加入的元素放在列表尾部。

fruits = ['berries', 'cherries', 'pear']
fruits.append('pomegranate')
print fruits
['berries', 'cherries', 'pear', 'pomegranate']

extend()

用于将其他序列合并到列表中,例如:

str1 = 'CAT'; lis1 = [1, 2, 3]; tup1 = ('b', 'c', 'a')
print lis1
lis1.extend(str1)
print lis1
lis1.extend(tup1)
print lis1
[1, 2, 3]
[1, 2, 3, 'C', 'A', 'T']
[1, 2, 3, 'C', 'A', 'T', 'b', 'c', 'a']

insert()

用于向列表中特定位置插入元素。

fruits = ['berries', 'cherries', 'pear']
fruits.insert(1, 'orange')
print fruits
['berries', 'orange', 'cherries', 'pear']

remove()

用于删除列表中的某个元素,没有返回值。

fruits = ['berries', 'cherries', 'pear']
a = fruits.remove('berries')
print fruits, a
['cherries', 'pear'] None

pop()

同样是删除列表中的元素,但是会将这个元素作为返回值返回。

fruits = ['berries', 'cherries', 'pear']
a = fruits.pop(0)
print fruits, a
['cherries', 'pear'] berries

reverse()

用于将列表倒序。

lis1 = ['a', 'b', 'c', 'd']
lis1.reverse()
print lis1
['d', 'c', 'b', 'a']

sort()

用于对列表进行排序。

lis1 = [3,1,6,2]
lis1.sort()
print lis1
[1, 2, 3, 6]

列表解析(List comprehensions)

特别有用的列表操作方法,可以遍历列表中的元素并根据相应的表达式生成新的列表。例如,我们要生成一个平方数构成的序列:

a = range(1,10)
print a
a_square = [i*i for i in a]
print a_square
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 4, 9, 16, 25, 36, 49, 64, 81]

字典

字典是一系列用逗号分隔的键-值对(key-value),使用花括号{}来定义。每个键-值对称为一个项(item),键和值之间用冒号:分隔,而项之间用逗号,分隔。例如:

port = {22: 'SSH', 23: 'Telnet', 53: 'DNS', 80: 'HTTP', (3,2):3}
port
{22: 'SSH', 23: 'Telnet', 53: 'DNS', 80: 'HTTP', (3, 2): 3}

字典有如下特点:

  • 键是不能更改的
  • 字符串、整型数字和浮点型数字都可以用作键
  • 不包含列表的元组也可以用作键
  • 键不能重复
  • 值可以是任何类型,如列表、字符串、整型等等
  • 值是可以重复的
  • 值可以被改变
  • 字典是一个无序集合,也就是定义字典时的顺序没有意义

字典的操作

字典是可以修改的,可以添加或删除项,也可以更新某个键的值。

访问值

需要通过键来访问值,例如下面的例子:

port = {22: 'SSH', 23: 'Telnet', 53: 'DNS', 80: 'HTTP', 443: 'HTTPS'}
port[23]
'Telnet'
port[443]
'HTTPS'

删除项

可以使用del来删除整个字典或者字典中的具体项。例如:

port
{22: 'SSH', 23: 'Telnet', 53: 'DNS', 80: 'HTTP', 443: 'HTTPS'}
del port[22]
port
{23: 'Telnet', 53: 'DNS', 80: 'HTTP', 443: 'HTTPS'}

更新值

更新字典中某一项的值非常简单,只要知道这一项的键,使用如下语法即可:

dict[key] = new_value

添加项

添加项也非常简单,直接指定新的键与值即可:

dict[new_key] = value

字典函数

len()

用来获取字典的项数,例如:

port = {22: 'SSH', 23: 'Telnet', 53: 'DNS', 80: 'HTTP', 443: 'HTTPS'}
len(port)
5

str()

可以将字典整体转换为字符串,例如:

dic1 = {1:'a', 2:'b'}
str(dic1)
"{1: 'a', 2: 'b'}"

max()和min()

如果将字典作为实参传入max()min()函数,那么将返回字典中键的最大值或最小值,例如:

port = {22: 'SSH', 23: 'Telnet', 53: 'DNS', 80: 'HTTP', 443: 'HTTPS'}
max(port), min(port)
(443, 22)

dict()

可以将列表或元组转换为字典,要求列表或元组中要有成对出现的元素(空列表或元组也可以,那么转换后的字典为空字典),例如:

t1 = ()
t2 = ((1,'a'), (2,'b'))
t3 = (('Bob', 98),)
l4 = [['age',25], ['gender', 'male']]

d1 = dict(t1)
d2 = dict(t2)
d3 = dict(t3)
d4 = dict(l4)

print d1, d2, d3, d4
{} {1: 'a', 2: 'b'} {'Bob': 98} {'gender': 'male', 'age': 25}

注意上例中的t3 = (('Bob', 98),)中,最后一个逗号是不可省略的!

字典方法

copy()

copy()方法用于复制字典,复制后的字典与原字典是两个相互独立的字典,也就是所谓的“深拷贝”,这时候原字典更改不会影响新字典,反之亦然。而使用赋值语句将原字典赋予新字典,则是“浅拷贝”,两个字典指向同一个内存地址,因此会出现一改全改的情况。

A1 = {1: 'a', 2: 'b'}
A2 = A1
CW = A1.copy()
print A1, A2, CW
{1: 'a', 2: 'b'} {1: 'a', 2: 'b'} {1: 'a', 2: 'b'}
print id(A1), id(A2), id(CW)
86794584 86794584 86926472
A1[3] = 'new value'
print A1, A2, CW
{1: 'a', 2: 'b', 3: 'new value'} {1: 'a', 2: 'b', 3: 'new value'} {1: 'a', 2: 'b'}

get()

get()方法的用法如下:

dict.get(key, default=None)

用于获得字典中某个键对应的值,如果这个键不存在,则返回默认值。

port = {22: 'SSH', 23: 'Telnet', 53: 'DNS', 80: 'HTTP', 443: 'HTTPS'}
port.get(22, 'not found'), port.get(24, 'not found')
('SSH', 'not found')

has_key()

用于检测字典中是否包含某个键。

port = {22: 'SSH', 23: 'Telnet', 53: 'DNS', 80: 'HTTP', 443: 'HTTPS'}
port.has_key(22), port.has_key(19)
(True, False)

keys(),values()和items()

用于返回字典中所有的键、值和项。

port = {22: 'SSH', 23: 'Telnet', 53: 'DNS', 80: 'HTTP', 443: 'HTTPS'}
port.keys()
[80, 443, 53, 22, 23]
port.values()
['HTTP', 'HTTPS', 'DNS', 'SSH', 'Telnet']
port.items()
[(80, 'HTTP'), (443, 'HTTPS'), (53, 'DNS'), (22, 'SSH'), (23, 'Telnet')]
for k, v in port.iteritems():
    print k, v
80 HTTP
443 HTTPS
53 DNS
22 SSH
23 Telnet

clear()

清空字典。

port = {22: 'SSH', 23: 'Telnet', 53: 'DNS', 80: 'HTTP', 443: 'HTTPS'}
print port
port.clear()
print port
{80: 'HTTP', 443: 'HTTPS', 53: 'DNS', 22: 'SSH', 23: 'Telnet'}
{}

返回目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容