Day2 - Python基础2 列表、字典、集合、编码

Day2 - Python基础2 列表、字典、集合

1.列表、元组操作

 1.1.列表

   切片

切片是基于索引操作
>>> numbers = [1,2,3,4,5,6,7,8,9,10]
>>> numbers[1:4]            #包含1不包含4
[2, 3, 4]
>>> numbers[:4]                #4之前全取
[1, 2, 3, 4]
>>> numbers[4:]                #包含4之后全取
[5, 6, 7, 8, 9, 10]
>>> numbers[::2]            #间隔2个取
[1, 3, 5, 7, 9]
>>> numbers[-1]                #从右往左取
10
View Code

  追加

 

>>> numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers.append('追加的')
>>> numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, '追加的']
View Code

 

  插入

>>> numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, '追加的']
>>> numbers.insert(4,'4.5插入的')
>>> numbers
[1, 2, 3, 4, '4.5插入的', 5, 6, 7, 8, 9, 10, '追加的']
View Code

  修改

>>> numbers
[1, 2, 3, 4, '4.5插入的', 5, 6, 7, 8, 9, 10, '追加的']
>>> numbers[4] = '4.5'
>>> numbers
[1, 2, 3, 4, '4.5', 5, 6, 7, 8, 9, 10, '追加的']
View Code

  删除

>>> numbers
[1, 2, 3, 4, '4.5', 5, 6, 7, 8, 9, 10, '追加的']
>>> del numbers[4]     #删除下标4的元素 
>>> numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, '追加的']
>>> numbers.remove('追加的')     #删除指定元素
>>> numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers.pop()     #默认删除最后一个元素
10
>>> numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
            
View Code

  扩展

>>> numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> nums = [10,20,30]
>>> numbers.extend(nums)
>>> numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30]
View Code

  拷贝

>>> nums
[10, 20, 30]
>>> nums_copy = nums.copy()
>>> nums_copy
[10, 20, 30]
>>> del nums_copy[0]    #拷贝修改不会影响原列表
>>> nums_copy
[20, 30]
>>> nums
[10, 20, 30]
>>> del nums[2]   #原列表修改不会影响拷贝
>>> nums
[10, 20]
>>> nums_copy
[20, 30]
>>>
View Code

  统计

>>> numbers = [1,2,3,1,5,6,3,8]
>>> numbers.count(1)
2
View Code

  排序&反转

>>> numbers
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> numbers.sort()        #排序
>>> numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers.reverse()  #反转
>>> numbers
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>>
View Code

  获取下标

>>> numbers
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> numbers.index(10)
0
View Code

 

 1.2.元组

又叫只读列表,一旦创建不能修改,只有2个方法,count 和index

# 方法:
a = (1,2,3)     #创建
print(a[0])     #查找(可以使用索引取元素)
for i in a:
    print(i)    #遍历列表元素
# 应用场景:
#选择菜单等不能让用户随便修改的地方
while True:
    option = ('1.北京','2.深圳','3.上海')
    print(option)
    choice = input("你喜欢的城市是(1/2/3):")
    if choice == '1':
        print(option[0])
    elif choice == '2':
        print(option[1])
    else:
        print(option[2])

2.字符串操作

#特性:不能修改
#首字母变大写
>>> name = 'my name is Sam'
>>> name.capitalize()   
'My name is sam'

#大写变成小写
>>> name = 'my name is SAM'
>>> name.casefold()     
'my name is sam'

#变量放中间,加起来10个字符长度
>>> name = 'sam'
>>> name.center(10,"*")
'***sam****'

#将字符串编码成bytes格式
>>> name = '成龙'
>>> name.encode()
b'\xe6\x88\x90\xe9\xbe\x99'

#判断是否以“end”结束
>>> name = 'This is end'
>>> name.endswith('end')
True

#查找字符,有则返回第1个索引,无则返回-1
>>> name = '这是一个AAAAA景区'
>>> name.find('A')
4
>>> name.find('B')
-1

#format
>>> student = "my name is {},age is {}"
>>> student.format("sam",18)
'my name is sam,age is 18'

>>> student = "my name is {name},age is {age}"
>>> student.format(age=18,name='sam')
'my name is sam,age is 18'


#format_map
>>> student
'my name is {name},age is {age}'
>>> student.format_map({'name':'sam','age':18})
'my name is sam,age is 18'

#返回字符所在的索引
>>> student
'my name is {name},age is {age}'
>>> student.index('name')
3

#判断是否是整数
>>> '1'.isdigit()
True

#替换字符串
>>> student = "my name is sam"
>>> student.replace("sam","jack",1)
'my name is jack'

#不足长度用0填充
>>> student = "my name is sam"
>>> student.zfill(50)
'000000000000000000000000000000000000my name is sam'
View Code

 

3.字典操作

  特性:

    1.一种key-value的数据类型

    2.dict是无序的

    3.key必须是唯一的,天生去重

  增加

>>> stars = {'star1':'Jackie Chan','star2':'Jet Li','star3':'Donnie Yen','star4':'Wu Jing'}
>>> stars['star5']='Tony Jia'
>>> stars
{'star4': 'Wu Jing', 'star2': 'Jet Li', 'star5': 'Tony Jia', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'}
View Code

  修改

>>> stars
{'star4': 'Wu Jing', 'star2': 'Jet Li', 'star5': 'Tony Jia', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'}
>>> stars['star5'] = 'ChiuMan-Cheuk'
>>> stars
{'star4': 'Wu Jing', 'star2': 'Jet Li', 'star5': 'ChiuMan-Cheuk', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'}
View Code

  删除

#标准方法删除
>>> stars
{'star4': 'Wu Jing', 'star2': 'Jet Li', 'star5': 'ChiuMan-Cheuk', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'}
>>> stars.pop('star5')
'ChiuMan-Cheuk'
>>> stars
{'star4': 'Wu Jing', 'star2': 'Jet Li', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'}

#del删除
>>> stars
{'star4': 'Wu Jing', 'star2': 'Jet Li', 'star3': 'Donnie Yen', 'star1': 'JackieChan'}
>>> del stars['star4']
>>> stars
{'star2': 'Jet Li', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'}

#随机删除
>>> stars
{'star2': 'Jet Li', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'}
>>> stars.popitem()
('star2', 'Jet Li')
View Code

  查找

#标准获取
>>> stars
{'star3': 'Donnie Yen', 'star1': 'Jackie Chan'}
>>> stars.get('star1')
'Jackie Chan'
>>> stars['star1']
'Jackie Chan'

[]没有对应的key时会报错,get方法不会,只返回None
View Code

  多级字典嵌套及操作

av_catalog = {
    "欧美":{
        "www.youporn.com": ["很多免费的,世界最大的","质量一般"],
        "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
        "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
        "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"]
    },
    "日韩":{
        "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
    },
    "大陆":{
        "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
    }
}

av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来"
print(av_catalog["大陆"]["1024"])
#ouput 
['全部免费,真好,好人一生平安', '服务器在国外,慢,可以用爬虫爬下来']
View Code

  其它方法

#values
>>> stars
{'star3': 'Donnie Yen', 'star1': 'Jackie Chan'}
>>> stars.values()
dict_values(['Donnie Yen', 'Jackie Chan'])

#keys
>>> stars.keys()
dict_keys(['star3', 'star1'])

#items
>>> stars.items()
dict_items([('star3', 'Donnie Yen'), ('star1', 'Jackie Chan')])
View Code

  循环dict

#方法1
>>> stars
{'star3': 'Donnie Yen', 'star1': 'Jackie Chan'}
>>> for key in stars:
...     print(key,stars[key])
...
star3 Donnie Yen
star1 Jackie Chan

#方法2
#会先把dict 转成list,数据大时勿用
>>> for k,v in stars.items():
...     print(k,v)
...
star3 Donnie Yen
star1 Jackie Chan
View Code

 

4.集合操作

  集合是一个无序,不重复的数据组合,作用如下:

  1.去重,把一个列表变成集合,就自动去重

  2.关系测试,测试两组数据之前的交、差、并集等

s = set([3,5,9,10])      #创建一个数值集合  
  
t = set("Hello")         #创建一个唯一字符的集合  


a = t | s          # t 和 s的并集  
  
b = t & s          # t 和 s的交集  
  
c = t – s          # 求差集(项在t中,但不在s中)  
  
d = t ^ s          # 对称差集(项在t或s中,但不会同时出现在二者中)  
  
   
  
基本操作:  
  
t.add('x')            # 添加一项  
  
s.update([10,37,42])  # 在s中添加多项  
  
   
  
使用remove()可以删除一项:  
  
t.remove('H')  
  
  
len(s)  
set 的长度  
  
x in s  
测试 x 是否是 s 的成员  
  
x not in s  
测试 x 是否不是 s 的成员  
  
s.issubset(t)  
s <= t  
测试是否 s 中的每一个元素都在 t 中  
  
s.issuperset(t)  
s >= t  
测试是否 t 中的每一个元素都在 s 中  
  
s.union(t)  
s | t  
返回一个新的 set 包含 s 和 t 中的每一个元素  
  
s.intersection(t)  
s & t  
返回一个新的 set 包含 s 和 t 中的公共元素  
  
s.difference(t)  
s - t  
返回一个新的 set 包含 s 中有但是 t 中没有的元素  
  
s.symmetric_difference(t)  
s ^ t  
返回一个新的 set 包含 s 和 t 中不重复的元素  
  
s.copy()  
返回 set “s”的一个浅复制
View Code

 

5.文件操作

  5.1.文件打开方式

  f = open("文件路径",“打开方式”,encoding=“编码方式”)

  f.close()    #记得要关闭

  with open("文件路径",“打开方式”,encoding=“编码方式”) as f:    #此方式不需考虑文件关闭问题,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

 5.2.打开文件的模式有:

r,只读模式(默认)
w,只写模式。【不可读;不存在则创建;存在则删除内容】
a,追回模式。【可读;不存在则创建;存在则只追加内容】

 

"+"表示可以同时读写某个文件
r+,可读写文件。【可读;可写;可追加】
w+,写读(不常用)
a+,同a

 

"U"表示在读取时,可以将\r \n \r\n自动换成\n(与r或r+模式同时使用)
rU
r+U

 

"b"表示处理二进制文件(如FTP发送上传ISO文件,linux可忽略,windows处理二进制时需标注)
rb
wb
ab

 

 5.3.修改文件内容

  追加方式容易处理

  修改部分内容较难处理,一般会新建一个文件,把原文件内容写入新文件再删除,然后把新文件名改成原文件名

6.字符编码与转码

 unicode万国码支持所有国家编码,因此不同编码方式转换时,需先编码decode成unicode

详细文章:

http://www.cnblogs.com/yuanchenqi/articles/5956943.html

http://www.diveintopython3.net/strings.html

需知:

1.在python2默认编码是ASCII, python3里默认是unicode

2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间

3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

 上图仅适用于py2

#-*- coding:utf-8 -*-

import sys

print sys.getdefaultencoding()    #默认编码是ascii方式 

msg = '我爱编程'    #因默认是ascii,所以会乱码
msg_gb2312 = msg.decode('utf-8').encode('gb2312')    #转换成gb2312
gb2312_to_gbk = msg_gb2312.decode('gb2312').encode('gbk')    #gb2312转换成GBK

print msg
print msg_gb2312
print gb2312_to_gbk

#执行结果
ascii
鎴戠埍缂栫▼
我爱编程
我爱编程
python2
import sys

print (sys.getdefaultencoding())    #默认是UTF-8

msg = '我爱北京天安门'    #不会乱码
#msg_gb2312 = msg.decode('utf-8').encode('gb2312')    #python2转换成gb2312
msg_gb2312 = msg.encode('gb2312')    #默认就是unicode,不用再decode
gb2312_to_utf8 = msg_gb2312.decode('gb2312').encode('utf-8')
bytes_to_str = gb2312_to_utf8.decode(encoding="utf-8")


print (msg)
print (msg_gb2312)
print (gb2312_to_utf8)
print (bytes_to_str)

#执行结果
utf-8
我爱北京天安门
b'\xce\xd2\xb0\xae\xb1\xb1\xbe\xa9\xcc\xec\xb0\xb2\xc3\xc5'
b'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x
97\xa8'
我爱北京天安门    
python3

 

posted @ 2018-04-30 01:00  Pynetwork  阅读(146)  评论(0编辑  收藏  举报