Add Day_2: 字典与字符串(URL参数解析)
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Day_2 参考解答
|
||||
=============
|
||||
主题:字典与字符串。
|
||||
建议:先自己写,写不出来再看;看完后关掉文件自己默写一遍。
|
||||
"""
|
||||
|
||||
# ============================================================
|
||||
# 题目一:模拟查询结果的处理(热身)
|
||||
# ============================================================
|
||||
|
||||
users = [
|
||||
{"name": "zhangsan", "age": 20, "city": "青岛"},
|
||||
{"name": "lisi", "age": 17, "city": "济南"},
|
||||
{"name": "wangwu", "age": 22, "city": "北京"},
|
||||
]
|
||||
|
||||
# 1. 筛选年龄 ≥ 18
|
||||
adults = [u for u in users if u["age"] >= 18]
|
||||
|
||||
# 2. 按年龄从大到小排序(key 指定按哪个字段排,reverse=True 表示降序)
|
||||
adults_sorted = sorted(adults, key=lambda u: u["age"], reverse=True)
|
||||
|
||||
# 3. 格式化成字符串列表
|
||||
formatted = [f"{u['name']}({u['age']}岁)" for u in adults_sorted]
|
||||
|
||||
# 4. 进阶:拼成一个字符串
|
||||
joined = ", ".join(formatted)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(adults)
|
||||
print([u["name"] for u in adults_sorted])
|
||||
print(formatted)
|
||||
print(joined)
|
||||
# [{'name': 'zhangsan', 'age': 20, 'city': '青岛'}, {'name': 'wangwu', 'age': 22, 'city': '北京'}]
|
||||
# ['wangwu', 'zhangsan']
|
||||
# ['wangwu(22岁)', 'zhangsan(20岁)']
|
||||
# wangwu(22岁), zhangsan(20岁)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 题目二:解析 URL 查询参数
|
||||
# ============================================================
|
||||
|
||||
def parse_query_string(query):
|
||||
"""把 'username=zhangsan&age=20' 解析成 {'username': 'zhangsan', 'age': '20'}"""
|
||||
result = {}
|
||||
if not query: # 边界 1:空输入
|
||||
return result
|
||||
for item in query.split('&'): # 先按 & 切成若干段
|
||||
if '=' in item:
|
||||
key, value = item.split('=', 1) # maxsplit=1:值里可能也含有 '=',只切第一个
|
||||
else:
|
||||
key, value = item, '' # 边界 3:没有 = 的参数,值记为空字符串
|
||||
result[key] = value # 字典赋值天然处理"重复键覆盖"和"值为空"
|
||||
return result
|
||||
|
||||
|
||||
# 进阶:URL 编码还原(把 + 和 %20 还原成空格)
|
||||
def url_decode(value):
|
||||
return value.replace('+', ' ').replace('%20', ' ')
|
||||
|
||||
|
||||
def parse_query_string_advanced(query):
|
||||
result = {}
|
||||
if not query:
|
||||
return result
|
||||
for item in query.split('&'):
|
||||
if '=' in item:
|
||||
key, value = item.split('=', 1)
|
||||
else:
|
||||
key, value = item, ''
|
||||
result[key] = url_decode(value)
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(parse_query_string('username=zhangsan&age=20&city=qingdao'))
|
||||
# {'username': 'zhangsan', 'age': '20', 'city': 'qingdao'}
|
||||
print(parse_query_string('name=a&name=b&flag'))
|
||||
# {'name': 'b', 'flag': ''}
|
||||
print(parse_query_string(''))
|
||||
# {}
|
||||
print(parse_query_string_advanced('name=Zhang+San&city=A%20B'))
|
||||
# {'name': 'Zhang San', 'city': 'A B'}
|
||||
Reference in New Issue
Block a user