1. 程式人生 > 其它 >Python基礎 - 05字串列表

Python基礎 - 05字串列表

Python基礎 - 05字串列表

一、字串

1.1字串的格式

雙引號或單引號中的資料,就是字串,

使用一對引號來定義字串,當出現符號衝突時可以使用轉義字元,

使用三個單引號、雙引號定義的字串可以包含任意文字。

# 轉義字元
print('haha\nhaha')              # 換行
print('haha\thaha')              # haha     haha
print('haha\\haha')              # haha\haha
print('haha\'hehehe\'haha')      # haha'hehehe'haha
print("haha\"h")                 # haha"h

Unicode的崛起
在20世紀60年代到80年代,最流行的字元編碼方案是ASCII(美國資訊交換標準編碼)。
ASCII 比 Unicode 簡單得多,但只能表示256個字元。對英語、法語和其他幾種類似的語言而言,這足夠了。
Unicode提供了一個大得多的字元編碼集。

出於方便考慮,Unicode的前256個字母為ASCII碼,如果只處理英文字元,幾乎不用考慮Unicode的細節。

print(ord('a'))  # 97
print(ord('b'))  # 98
print(ord('A'))  # 65
print(chr(66))   # B
print(chr(99))   # c

s1 = 'hello'
s2 = s1
s3 = 'hello'
print(s1, s2, s3)     # hello hello hello
print(id(s1))         # 16035697648
print(id(s2))         # 16035697648
print(id(s3))         # 16035697648
# s1, s2, s3 指向同一個地址, 'hello'的記憶體地址
# is 判斷 s4 = 'world' print(id(s4)) # 1041659770672 print(s1 is s3) # True print(s1 is s4) # False

1.2字串的下標和切片

# 字串擷取  字串索引機制:  0 ~ len(s)-1  或  -len(s) ~ -1 
s1 = 'ABCDEFG'
print(s1[1])      # B
print(s1[0])      # A
# print(s1[9])    # IndexError: string index out of range
print(s1[-1])     # G
print(len(s1))    # 7

# 切片           格式:字串變數[start:end)
print(s1[1:4])   # BCD
print(s1[0:5])   # ABCDE
print(s1[:5])    # ABCDE

print(s1[-3:-1])  # EF
print(s1[-3:])    # EFG  從-3開始到結尾

x = s1[:]
print(x)          # ABCDEFG
print(s1)         # ABCDEFG
print(id(x))      # 905626932208
print(id(s1))     # 905626932208

print(s1[1:-1])   # BCDEF

print('*'*20)
print(s1[:-1:2])   # ACE,從-len(s)到-1,step為2
print(s1[1::2])    # BDF
print(s1[::4])     # AE
# 字串變數[start:end:step] 預設從左向右一個一個取元素
# step: 步長、方向。 正數->從左向右, 負數->從右向左
print(s1[::-1])    # GFEDCBA
print(s1[::-2])    # GECA
print(s1[0:6:-2])  # 為空
print(s1[6:0:-2])  # GEC

1.3 字串常見操作 

  • 獲取長度:  len
  • 查詢內容:  find / index / rfind / rindex
  • 判斷:    startswith / endswith / isalpha / isdigit / isalnum / isspace / isnumeric
  • 出現次數:  count
  • 替換內容:  replace
  • 切割字串: split / rsplit / splitlines / partition / rpartition
  • 修改大小寫: capitalize / title / upper / lower / swapcase
  • 空格處理:  ljust / rjust / center / lstrip / strip
  • 字串拼接: join

注: 在Python中, 字串是不可變的。所有字串的相關方法,都不會改變原有字串,都是返回一個結果。在新的返回值裡,保留了執行後的結果。

# find:  從左向右查詢,只要遇到一個符合要求的則返回位置。沒有找到返回-1。
# rfind:  從右向左查詢,只要遇到一個符合要求的則返回位置。沒有找到返回-1。
# index 與 find 的區別: index如果沒有找到會拋異常
path = 'https://pics2.baidu.com/feed/dong_0824ab18972bd4079fe54f4202278b580eb309a2.jpeg' i = path.find('_') print(i)            # 33 第一個匹配到的位置 image_name = path[i + 1:] print(image_name)       # 0824ab18972bd4079fe54f4202278b580eb309a2.jpeg i = path.find('#') print(i)        # -1  未匹配到時,返回-1 # ValueError: substring not found # i = path.index('#') # print(i) i = path.rfind('.') suffix = path[i:] print(suffix)        # .jpeg n = path.count('.') print(n)           # 3 s = '0824ab18972bd4079fe54f4202278b580eb309a2.jpeg' result = s.startswith('08')  print(result)        # True result = s.endswith('mp5') print(result)        # False s = 'HELLO' result = s.isalpha() print(result)        # True s = 'A1234_' result = s.isalnum()     print(result) s = '11123' result = s.isdigit() print(result) s = ' ' result = s.isspace() print(result)        # '' -> False ' '-> True ' '-> True s='helloA' result = s.isupper() print(result) result = s.islower() print(result)

 

s = '佛祖說: 阿彌陀佛,南無阿彌陀佛!'
result = s.replace('佛', '**')
print(result)  # **祖說: 阿彌陀**,南無阿彌陀**!
result = s.replace('佛', '**', 1) 
print(result)  # **祖說: 阿彌陀佛,南無阿彌陀佛!

result = s.replace('佛說', '##', 1)   # replace(old, new, count)
print(result)  # 佛祖說: 阿彌陀佛,南無阿彌陀佛!

s = '張三 李四 王五'
result = s.split(' ')
print(result)  # ['張三', '李四', '王五']

s = '''第一行唱山歌
第二行唱土歌
第三行唱歌
'''
result = s.splitlines()
print(result)  # ['第一行唱山歌', '第二行唱土歌', '第三行唱歌']

s = '張三 李四 王五'
result = s.partition(' ')
print(result)  # ('張三', ' ', '李四 王五')
result = s.rpartition(' ')
print(result)  # ('張三 李四', ' ', '王五')

 

s = 'hello world'
result = s.title()
print(result) # Hello World

result = s.upper()
print(result) # HELLO WORLD

result = s.lower()
print(result) # hello world

result = s.capitalize()
print(result) # Hello world
s = ' admin '
print(len(s))     # 7
result = s.strip()
print(len(result))  # 5
print(result)     # admin
result = s.lstrip()
print(len(result))  # 6
print(result)     # admin_
result = s.rstrip()
print(len(result))  # 6
print(result)     # _admin

s = 'hello world'
result = s.center(30)
print(result)     # |         hello world          |
result = s.ljust(30)
print(result)     # hello world                   |
result = s.rjust(30)
print(result)     # |                   hello world
name = '趙麗穎'
age = 30
result = '美女{}今年{}歲'.format(name, age)
print(result)    # 美女趙麗穎今年30歲

result = '美女{0}今年{1}歲,我也是{1}歲'.format(name,age)
print(result)    # 美女趙麗穎今年30歲,我也是30歲
result = '美女{girl}今年{a}歲,我也是{a}歲'.format(girl='君君',a=1)
print(result)    # 美女君君今年1歲,我也是1歲

stu_name = '艾瑪'
score_math = 100
score_chinese = 90

s = '{0}本次考試數學分數為:{2},語文分數為:{1},英語分數為:{2}'.format(stu_name,score_chinese,score_math)
print(s)       # 艾瑪本次考試數學分數為:100,語文分數為:90,英語分數為:100

s.maketrans(old,new)建立一個轉換表,用於將old中的字元改成new中的相應字元;

s.translate(table) 使用指定轉換表(使用maketrans建立的)對s中的字元進行替換

s.zfill(width) 在s左邊新增足夠多的0,讓字串的長度為width

s = 'aabbcc'
table = s.maketrans('abc','ABC')
print(s.translate(table))           # AABBCC

print('23'.zfill(4))                # 0023
print('-87'.zfill(5))               # -0087

 

s = '_'
print(s.join('abc'))  # a_b_c

print(s.encode())     # b'_'

s = 'aaBBcc'
print(s.swapcase())   # AAbbCC

二、列表

2.1定義列表

list1 = []             # 空列表
list2 = ['牛奶', '麵包', '火腿', '辣條', '饅頭']
print(type(list1))     # <class 'list'>
print(list2[3])        # 辣條
print(list2[0])        # 牛奶

2.2列表操作

# 切片 [start,end)
print(list2[1:3])         # ['麵包', '火腿']
print(list2[:2])          # ['牛奶', '麵包']

print(list2[::-3])        # ['饅頭', '麵包']
print(list2[::3])         # ['牛奶', '辣條']
print(list2[-2:-5:-2])    # ['辣條', '麵包']
print(list2[-2::-5])      # ['辣條'] 從右向左,-2到-5

  

# 新增
list1 = []
list2 = ['麵包']
list1.append('蘋果')
list1.append('香蕉')
list1.append('木瓜')
print(list1)                # ['蘋果', '香蕉', '木瓜']
list1.append(list2)
print(list1)                # ['蘋果', '香蕉', '木瓜', ['麵包']]
list1 = list1 + list2
print(list1)                # ['蘋果', '香蕉', '木瓜', ['麵包'], '麵包']
list1.extend(list2)
print(list1)                # ['蘋果', '香蕉', '木瓜', '麵包']
print(list1 * 2)            # ['蘋果', '香蕉', '木瓜', '麵包', '蘋果', '香蕉', '木瓜', '麵包']
if '蘋果' in list1:
    print('存在')
else:
    print('不存在')

  

# pop(index): 根據下標刪除列表中的元素,不能超出範圍
# pop(): 從後往前依次刪除
list1 = ['蘋果', '香蕉', '木瓜', '麵包', '饅頭']
list1.pop()
print(list1)  # ['蘋果', '香蕉', '木瓜', '麵包']
list1.pop() 
print(list1)  # ['蘋果', '香蕉', '木瓜']

  

# remove: 只刪除匹配到,如果列表中有多個同名元素,只刪除遇到的第一個元素,後面的元素不會被刪除。
list2 = ['蘋果', '饅頭', '香蕉', '木瓜', '麵包', '饅頭']
list2.remove('饅頭')
print(list2)  # ['蘋果', '香蕉', '木瓜', '麵包', '饅頭']
# ValueError: list.remove(x): x not in list
# list2.remove('菠蘿')

list2 = ['蘋果', '饅頭', '香蕉', '木瓜', '麵包', '饅頭']
for i in list2:
    if i == '饅頭':
        list2.remove(i)
print(list2)  # ['蘋果', '香蕉', '木瓜', '麵包']

list3 = ['蘋果', '饅頭', '饅頭', '饅頭', '香蕉', '木瓜', '麵包', '饅頭', '菠蘿']
for i in list3:
    if i == '饅頭':
        list3.remove(i)
print(list3)  # ['蘋果', '香蕉', '木瓜', '麵包', '饅頭','菠蘿']

list4 = ['蘋果', '饅頭', '饅頭', '香蕉', '木瓜', '麵包', '饅頭', '菠蘿']
n = 0
while n < len(list4):
    if list4[n] == '饅頭':
        list4.remove('饅頭')
    else:
        n += 1
print(list4)  # ['蘋果', '香蕉', '木瓜', '麵包', '菠蘿']

  

list1 = [1, 2, 3, 4, 5, 6]
list1.insert(1, 8)
print(list1)  # [1, 8, 2, 3, 4, 5, 6]
list1[1] = 9
print(list1)  # [1, 9, 2, 3, 4, 5, 6]

pos = list1.index(4)
list1[pos] = 14
print(list1)  # [1, 9, 2, 3, 14, 5, 6]

li = ['蘋果', 1, 2, '蘋果', '蘋果', 45, 12, '蘋果']
for i in range(li.count('蘋果')):
    li.remove('蘋果')
print(li)  # [1, 2, 45, 12]

del li
# NameError: name 'li' is not defined
# li.append(10)
# print(li)

  

list1 = [1, 2, 3, 4, 5, 6]
print(id(list1))  # 418405881856
list2 = list1
print(list2)      # [1, 2, 3, 4, 5, 6]
print(id(list2))  # 418405881856
list2.append(88)
print(list1)      # [1, 2, 3, 4, 5, 6, 88]
print(list2)      # [1, 2, 3, 4, 5, 6, 88]
list1.clear()
print(list2)      # []
del list2
print(list1)      # []

a = 'hello'
b = a
c = a
del a
print(b, c)       # hello hello

  

import random

numbers = []
for i in range(8):
    ran = random.randint(1,20)
    numbers.append(ran)
print(numbers)         # [15, 6, 20, 6, 4, 8, 16, 13]
numbers.sort()         # 預設為升序
print(numbers)         # [4, 6, 6, 8, 13, 15, 16, 20]
numbers.sort(reverse=True)
print(numbers)         # [18, 17, 13, 10, 9, 6, 1, 1]
# 反轉
numbers.reverse()      # [18, 5, 17, 19, 3, 6, 7, 10]
print(numbers)

  

# 自引用列表: 讓一個列表元素指向列表本身
# 列印輸出中的[...]表明,Python能夠識別自引用,沒有愚蠢地不斷列印列表。
lst = [1, 2, 'c', 'd', 'f']
lst[2] = lst
print(lst)             # [1, 2, [...], 'd', 'f']

  

# 列表迴圈
numbers = [18, 5, 17, 19, 3, 6, 7, 10]
for i in numbers:
    print(i)

#交換兩個變數的值
a = 2
b = 3
print(a, b)  # 2 3
c = a
a = b
b = c
print(a, b)  # 3 2

a, b = b, a
print(a, b)  # 2,3

  

# 手動氣泡排序:
num = []
for i in range(8):
    ran = random.randint(1, 100)
    num.append(ran)
print('排序前的num:', num)
for i in range(len(num)-1):
    for j in range(len(num)-1-i):
        if num[j] > num[j + 1]:
            temp = num[j]
            num[j] = num[j + 1]
            num[j + 1] = temp
        else:
            j += 1
    print('第{}次排序結果為{}'.format(i,num))
print('排序後的num:', num)
#-----------------------------------
排序前的num: [89, 54, 41, 31, 82, 70, 42, 15]
第0次排序結果為[54, 41, 31, 82, 70, 42, 15, 89]
第1次排序結果為[41, 31, 54, 70, 42, 15, 82, 89]
第2次排序結果為[31, 41, 54, 42, 15, 70, 82, 89]
第3次排序結果為[31, 41, 42, 15, 54, 70, 82, 89]
第4次排序結果為[31, 41, 15, 42, 54, 70, 82, 89]
第5次排序結果為[31, 15, 41, 42, 54, 70, 82, 89]
第6次排序結果為[15, 31, 41, 42, 54, 70, 82, 89]
排序後的num: [15, 31, 41, 42, 54, 70, 82, 89]