1. 程式人生 > 實用技巧 >list、dict、set、元祖、字串和檔案

list、dict、set、元祖、字串和檔案

一、list的排序(倒序和降序)

list1 = [1, 2, 4, 2, 6]
for i in list1:
    print(i)

# 排序 --倒序
list1.reverse()
print(list1)

# 升序
list1.sort()
print(list1)
# 降序
list1.sort(reverse=True)
print(list1)

二、list轉成字典

user_list = ['cyx', 'lml', 'tqb']
pwd_list = [123, 456, 789]
user_list_dict = {}
# 將list存入字典中 當兩個list長度不等時 用長度來迴圈
for i in range(len(user_list)): user_list_dict[user_list[i]] = pwd_list[i] print(user_list_dict)

三、dict增、刪、改、查和遍歷

# 字典與json相似
# 區別在於json必須要雙引號 字典兩者皆口
user_dict = {'cyx': 123, 'lml': 456, 'tqb': 789}

#
# value是不限制資料型別的,一個字典裡可放多個數據型別 也可以直接將定義的變數賦值進去
user_dict['python'] = 1234
user_dict['list
'] = [1, 2, 3, 4] user_dict['str'] = 'password' # key一般定義為可以識別 能理解的key # 每個key為userID時,value是user資訊 key可以命名為數字 user_dict[1001] = {'name': 'cyx', 'age': 18, 'score': 98.0} print(user_dict) # 刪-------del del user_dict[1001] print(user_dict) # 刪-------pop =======會返回刪除的key對應的值 print(user_dict.pop('cyx')) #
user_dict['lml'] = 123 print(user_dict) # 查=====精準查詢 print(user_dict['python']) print(user_dict['list']) # 查詢不存在的值 print(user_dict.items()) # 遍歷整個dict 每個key-value輸出為元祖 print(user_dict.keys()) # 返回所有的key 輸出為list print(user_dict.values()) # 返回所有的value 輸出為list

# 遍歷字典中所有的key # 第一種=======keys()取出所有的key for k in user_dict.keys(): print(k) # 第二種=======取出字典所有的元素 for k in user_dict.items(): print(k) print(k[0], k[1]) # 第三種=========兩張變數的迴圈 for k, v in user_dict: print(k, v) # 判斷key是否存在 # 第一種 user_dict['43242'] # 會報keyerror # 第二種 print(user_dict.get('432432')) # 值不存在時,返回None

四、set集合

# 集合set 不可重複 可以用來去重
w = [1, 2, 3, 2, 4, 5, 3]
print(set(w))

s = {1, 2, 3, 4, 5}
s1 = {2, 4, 6, 8, 0}
# 合併集合
s.update(s1)      # s集合與s1的並集 在s集合的基礎上進行修改 不生成新的集合
print(s)
# 交集
s3 = s.intersection(s1)
print(s3)
# 並集
s2 = s.union(s1)  # 兩個集合並起,形成一個新的集合
print(s2)

# 差集  在s中存在 在s1中不存在的
s4 = s ^ s1
print(s4)

五、元祖tuple和list之間的轉換

# 元祖資料不能修改(tuple)
t = (1, 2, 3, 4)
l1 = [1, 2, 3, 4]
# 除不能修改排序,基本方法基本一樣
# 如何list和元祖互相轉換
# list---tuple 強轉
t2 = tuple(l1)
print(t2)

# 迴圈轉入list中
t1 = []
for i in t:
    t1.append(i)
print(t1)
# 元祖可強轉為list 無法迴圈
l2 = list(t)
print(l2)

六、字串的常用方法(查、格式化、去空格及大小寫轉換)

t = 'hahabhba'
# a出現的次數
print(t.count('a'))

# 從左到右查詢 a第一次出現所在的下標
print(t.find('a'))
print(t.find('b'))

# 和find一樣
print(t.index('b'))

# format
un = '姓名:{name},年齡:{age}'
print(un.format(name='xw', age=20))  # 賦值 寫死

# format_map 把字典中的每個key和字串中的宣告的站位去進行查詢 更靈活
print(un.format_map({'name': 'wqw','age': 20}))

# 去空格 去除前後的空格
print('  abc'.strip())
print('abc   '.strip())
print('a b c'.strip())

# 判斷是否是純空格 返回bool型別
print(' '.isspace())  # True
print(' 1 '.isspace())  # False

# isalpha 判斷是否是純數字 純數字返回False 其他返回True
print('今天'.isalpha())
print('123'.isalpha())
print('adsd'.isalpha())
print('ad123>>'.isalpha())

# 轉換大小寫
f = 'hhaQWE'
print('f:', f)
print(t.upper())  # 大寫
print(t.lower())  # 小寫

# =====重要=====

f1 = 'xiaowang,xiaoli,xiaoming'
print(f1.split(','))
print(f1.replace(',', '\n'))  # 把,替換成換行符/n
val = '這學生的姓名是:{name}'
for i in f1.split(','):
    print(val.format(name=i))
# 倒序
new_f1 = f1.split(',')  # 切分
print(new_f1.reverse())  # 反轉
for i in new_f1:
    print(val.format(name=i))

# 提取ip,用空格分開,分開後,會生成list 取list下標為1的元素
str = '223.104.3.169 - - [03/Jul/2020:17:09:33 +0800] ''' \
      '"GET /bbs/forum.php HTTP/1.1" 404 1045 "-" "Apache-HttpClient/4.5.10 (Java/1.8.0_201)"'
log = str.split(' ')[0]
print(log)

# 是否以輸入的內容開始或結束 返回布林型別
print(t.startswith('h'))
print(t.endswith('h'))
print(t.endswith('b'))

# 去除左、右空格
print(' a bc '.lstrip())
print(' ab c '.rsplit())  # 返回的是列表
print(' ab c '.strip())

六、字串的切片使用

s = 'http://baidu.com/'
# s[起始:結束:步長]print(s[7:])  # 起始為7,結束為最後一位
print(s[:6])  # 沒有結束,只有起始,則代表從0開始,到6的前面
print(s[1:4])  # 從1開始 到4之前結束
print(s[1:3:2])  # 2是步長 每次遞增2
print(s[:-13])
print(s[:-1])
li = [1, 2, 5, 2, 4, 5, 1, 4]
print(li[2:6])  # 切片應用,提取下標2(包含)到下標為6(不包含)直接的值

七、檔案讀寫

# 1、檔案開啟
# 相對路徑
# ../day02/n.txt(上層目錄)  ./n.txt(當前路徑) ../../day02/n.txt(多層路徑)
# 絕對路徑
# /user/local/ngixt/n.txt

file = open('n.txt', encoding='utf-8')
# print(file)  打印出來是物件
# 全部讀取
print(file.read())  # 檔案讀取是流 讀過了 下面再讀就沒有內容了
# 讀取一行
print(file.readline())
# 讀取所有行  返回的是列表
print(file.readlines())
# 關閉檔案
file.close()

file1 = open('n.txt', encoding='utf-8')
# 第一種 迴圈遍歷檔案
for l in file1.readlines():
    print(l.strip())

# 第二種 逐行讀取 最好選擇逐行
for line in file1:
    print(line.strip())
file1.close()
# 操作模式 分為r(僅讀取) w(寫入,每次新寫入) a(追加append)
f = open('a.txt', 'w', encoding='utf-8')
data = '天琴座'
# 寫入資料
f.write(data)
l1 = ['xq', 'ws', 'ed']
# 第一種寫入
f.writelines(l1)
# 第二種 迴圈寫入
for i in l1:
    f.write(i)
    f.write('\n')
f.close()

八、非空即真

# 布林型別 True False 只要變數是有值為真,為空或None為假
print(bool(None))
print(bool(''))
print(bool('1'))

user = input('請輸入使用者名稱:')
print(user)
if user:
    print("使用者輸入的內容:", user)
else:
    print('未輸入')

九、日誌提取ip報警練習

# nginx日誌監控系統
# 資料來源為access。log
# 用來監控日誌中記錄的ip
# 當某一個ip出現次數超過50次後 報警
# 且打印出報警資訊 報警XXXX地址 已經訪問超50次
# 執行頻率 每分鐘執行一次

# 讀取
import time
# 讓這個程式滾動起來 不會停止
# while True:
#     file = open('access.log', encoding='utf-8')
#     # print(file.readlines())
#     # 提取ip 記錄次數
#     ip = []
#     for l1 in file:
#         ip.append(l1.strip().split(' ')[0])
#     # print(ip)
#     set_ip = set(ip)
#     for i in set_ip:
#         if ip.count(i) >= 50:
#             # 列印報警資訊
#             print('報警{ip}地址 已經訪問超50次'.format(ip=i))
#     print(set_ip)
#
#     # 每次讀取時,需要跳過已讀資料,需要記錄上次讀取位數 下次讀取時 先進行跳轉
#     file.close()
#     print('end')
#     time.sleep(5)
ip_dict = {}
point = 0
while True:
    file = open('access.log', encoding='utf-8')
    # print(file.readlines())
    # 跳到上次讀取的位置,如果第一次就是初始值point為0
    file.seek(point)
    # 需考慮是否要清空
    for line in file:
        ip = line.strip().split(' ')[0]
        # 提取ip 記錄次數,如清空需要全量去讀取,
        # 如果不清空則每次要加入增量,不然把重複的資料會加入到字典中
        if ip_dict.get(ip):  # 獲取對應k的值 沒有則走下一個迴圈
            ip_dict[ip] += 1
        else:
            ip_dict[ip] = 1
    for k, v in ip_dict.items():
        if v >= 50:
            # 列印報警資訊
            print('報警{ip}地址 已經訪問超50次'.format(ip=k))
    # 記錄讀取後的位置
    point = file.tell()
    # 每次讀取時,需要跳過已讀資料,需要記錄上次讀取位數 下次讀取時 先進行跳轉
    file.close()
    print('end')
    time.sleep(5)