四、数据结构:组织的艺术
4.1 数组/列表:有序的集合
// JavaScript 数组(动态,可混合类型)
let arr = [1, 2, 3, 4, 5];
// 常用操作
arr.push(6); // 末尾添加 [1,2,3,4,5,6]
arr.pop(); // 移除末尾 [1,2,3,4,5]
arr.unshift(0); // 开头添加 [0,1,2,3,4,5]
arr.shift(); // 移除开头 [1,2,3,4,5]
arr[2]; // 索引访问:3
arr.length; // 长度:5
arr.indexOf(3); // 查找索引:2
arr.includes(5); // 是否包含:true
// 切片(不修改原数组)
let slice = arr.slice(1, 4); // [2,3,4]
// 拼接
let combined = arr.concat([6, 7, 8]); // [1,2,3,4,5,6,7,8]
# Python 列表
lst = [1, 2, 3, 4, 5]
lst.append(6) # 末尾添加
lst.pop() # 移除末尾
lst.insert(0, 0) # 指定位置插入
lst.remove(3) # 移除第一个匹配项
lst[2] # 索引访问
len(lst) # 长度
3 in lst # 成员检查:True
lst.index(4) # 查找索引
lst.sort() # 排序(原地)
sorted(lst) # 返回新排序列表
数组常用算法:
// 遍历
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
// forEach 高阶函数
arr.forEach(item => console.log(item));
// map:转换每个元素
let doubled = arr.map(x => x * 2);
// filter:筛选元素
let evens = arr.filter(x => x % 2 === 0);
// reduce:归纳计算
let sum = arr.reduce((acc, curr) => acc + curr, 0);
// find:查找第一个匹配
let found = arr.find(x => x > 3);
4.2 对象/字典:键值对的映射
// JavaScript 对象
let user = {
name: "张三",
age: 25,
isActive: true,
// 方法
greet() {
return `你好,我是${this.name}`;
}
};
// 访问属性
user.name; // "张三"
user["age"]; // 25(使用变量时有用)
// 添加/修改属性
user.email = "zhangsan@example.com";
user["phone"] = "123456789";
// 删除属性
delete user.phone;
// 遍历对象
for (let key in user) {
console.log(`${key}: ${user[key]}`);
}
// 获取所有键/值
Object.keys(user); // ["name", "age", "isActive", ...]
Object.values(user); // ["张三", 25, true, ...]
Object.entries(user); // [["name","张三"], ["age",25], ...]
# Python 字典
user = {
"name": "张三",
"age": 25,
"is_active": True
}
# 访问(用 get 避免 KeyError)
user["name"] # "张三"
user.get("email", "无") # 安全访问,指定默认值
# 添加/修改
user["email"] = "zhangsan@example.com"
# 删除
del user["is_active"]
# 遍历
for key, value in user.items():
print(f"{key}: {value}")
# 字典推导式
squares = {x: x**2 for x in range(5)} # {0:0, 1:1, 2:4, 3:9, 4:16}
4.3 Set:不重复的集合
// JavaScript Set
let uniqueNumbers = new Set([1, 2, 3, 3, 4, 4, 5]);
console.log(uniqueNumbers); // Set(5) {1,2,3,4,5}
uniqueNumbers.add(6);
uniqueNumbers.delete(3);
uniqueNumbers.has(2); // true
uniqueNumbers.size; // 5
// 数组去重
let arr = [1, 2, 2, 3, 3, 4];
let unique = [...new Set(arr)]; // [1,2,3,4]
# Python Set
unique_numbers = {1, 2, 3, 3, 4, 4, 5}
print(unique_numbers) # {1,2,3,4,5}
unique_numbers.add(6)
unique_numbers.remove(3)
2 in unique_numbers # True
len(unique_numbers) # 5
# 集合运算
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
set1 | set2 # 并集 {1,2,3,4,5,6}
set1 & set2 # 交集 {3,4}
set1 - set2 # 差集 {1,2}
set1 ^ set2 # 对称差 {1,2,5,6}
五、字符串处理:文本的艺术
https://amwtm.cn/
5.1 字符串基础操作
# Python 字符串
text = "Hello, World!"
# 长度
len(text) # 13
# 索引(0开始,负数表示从末尾)
text[0] # 'H'
text[-1] # '!'
# 切片 [start:end:step]
text[0:5] # 'Hello'
text[7:] # 'World!'
text[::2] # 'Hlo ol!'(步长2)
text[::-1] # '!dlroW ,olleH'(反转)
# 大小写转换
text.upper() # 'HELLO, WORLD!'
text.lower() # 'hello, world!'
text.capitalize() # 'Hello, world!'
text.title() # 'Hello, World!'
# 查找替换
text.find("World") # 7(返回索引,找不到返回-1)
text.replace("World", "Python") # 'Hello, Python!'
# 分割连接
words = text.split(", ") # ['Hello', 'World!']
" ".join(words) # 'Hello World!'
# 去除空白
" hello ".strip() # 'hello'
// JavaScript 字符串
let text = "Hello, World!";
text.length; // 13
text[0]; // 'H'
text.charAt(0); // 'H'
text.indexOf("World"); // 7
text.includes("Hello"); // true
text.slice(0, 5); // 'Hello'(支持负数)
text.substring(0, 5); // 不支持负数
text.substr(7, 5); // 'World'(已废弃)
text.toUpperCase(); // 'HELLO, WORLD!'
text.toLowerCase(); // 'hello, world!'
text.replace("World", "JavaScript"); // 'Hello, JavaScript!'
text.split(", "); // ['Hello', 'World!']
text.trim(); // 去除两端空白
// 模板字符串(ES6)
let name = "张三";
let age = 25;
let message = `我叫${name},今年${age}岁`; // 支持换行和表达式
5.2 字符串格式化
# Python 三种格式化方式
# 1. % 格式化(旧式)
name = "张三"
score = 95.5
print("姓名:%s,分数:%.1f" % (name, score))
# 2. str.format() 方法
print("姓名:{},分数:{}".format(name, score))
print("姓名:{n},分数:{s}".format(n=name, s=score))
# 3. f-strings(Python 3.6+,推荐)
print(f"姓名:{name},分数:{score:.1f}")
print(f"计算结果:{10 + 20}")
print(f"三倍:{score * 3:.2f}")
// JavaScript 字符串格式化
// 1. 模板字符串(推荐)
let name = "张三";
let score = 95.5;
console.log(`姓名:${name},分数:${score}`);
// 2. 拼接
console.log("姓名:" + name + ",分数:" + score);
5.3 正则表达式基础
// JavaScript 正则表达式
let email = "user@example.com";
// 测试是否匹配
let emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
console.log(emailPattern.test(email)); // true
// 提取匹配内容
let text = "我的电话是 138-1234-5678";
let phonePattern = /(\d{3})-(\d{4})-(\d{4})/;
let match = text.match(phonePattern);
console.log(match[1]); // 138
console.log(match[2]); // 1234
console.log(match[3]); // 5678
// 替换
let phone = "13812345678";
let formatted = phone.replace(/(\d{3})(\d{4})(\d{4})/, "$1-$2-$3");
console.log(formatted); // 138-1234-5678
# Python 正则表达式
import re
email = "user@example.com"
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
print(bool(re.match(pattern, email))) # True
# 查找所有匹配
text = "我的电话是 138-1234-5678,备用 139-8765-4321"
phone_pattern = r'(\d{3})-(\d{4})-(\d{4})'
matches = re.findall(phone_pattern, text)
print(matches) # [('138','1234','5678'), ('139','8765','4321')]
# 替换
phone = "13812345678"
formatted = re.sub(r'(\d{3})(\d{4})(\d{4})', r'\1-\2-\3', phone)
print(formatted) # 138-1234-5678