在 C# 里你得区分数组和列表int[] arr { 1, 2, 3 }; // 固定大小 Listint list new() { 1, 2, 3 }; // 动态大小在 Python 里只有一个listlst [1, 2, 3] # 就这么简单没有固定大小没有泛型声明没有new关键字。Python 的列表就是这么随性。还有那个列表推导式[x*2 for x in lst]一行代码顶 C# 的lst.Select(x x*2).ToList()。今天咱们来聊聊列表和数组——C# 的Array List vs Python 的list。列表创建C# 版本// 数组固定大小 int[] arr1 { 1, 2, 3 }; int[] arr2 new int[] { 1, 2, 3 }; int[] arr3 new int[5]; // 默认值为 0 // List动态大小 Listint list1 new() { 1, 2, 3 }; Listint list2 new Listint { 1, 2, 3 }; Listint list3 new Listint(); // 空列表 // 其他集合 var stack new Stackint(); var queue new Queueint(); var linkedList new LinkedListint();Python 版本# 列表动态大小唯一选择 lst1 [1, 2, 3] lst2 list([1, 2, 3]) lst3 list() # 空列表 lst4 [] # 空列表更常用 # 初始化 lst5 [0] * 5 # [0, 0, 0, 0, 0] lst6 [None] * 3 # [None, None, None] # 其他容器 stack [] # 用列表模拟栈 from collections import deque queue deque() # 双端队列对比项C#Python固定数组int[] arr {1,2,3}不存在动态列表Listint list new()list [1,2,3]空列表new Listint()[]或list()初始化new int[5][0] * 5类型声明必须指定泛型不需要C# 的int[]是固定大小的Listint是动态的。Python 只有list永远是动态的没有固定大小的概念。列表操作C# 版本var list new Listint { 1, 2, 3, 4, 5 }; // 添加元素 list.Add(6); // 添加到末尾 list.Insert(0, 0); // 插入到指定位置 list.AddRange(new[] { 7, 8 }); // 添加多个 // 删除元素 list.Remove(3); // 删除第一个匹配项 list.RemoveAt(0); // 删除指定索引 list.RemoveAll(x x 4); // 删除所有匹配项 list.Clear(); // 清空 // 查找 int index list.IndexOf(3); // 查找索引 bool exists list.Contains(3); // 是否包含 int found list.Find(x x 3); // 查找第一个匹配项 // 排序和反转 list.Sort(); // 排序 list.Reverse(); // 反转 // 切片 var sub list.GetRange(1, 3); // 从索引1开始取3个Python 版本lst [1, 2, 3, 4, 5] # 添加元素 lst.append(6) # 添加到末尾 lst.insert(0, 0) # 插入到指定位置 lst.extend([7, 8]) # 添加多个 # 删除元素 lst.remove(3) # 删除第一个匹配项 del lst[0] # 删除指定索引 lst.pop(0) # 删除并返回指定索引 lst.pop() # 删除并返回最后一个 lst.clear() # 清空 # 查找 index lst.index(3) # 查找索引 exists 3 in lst # 是否包含运算符不是方法 # 排序和反转 lst.sort() # 排序原地 lst.reverse() # 反转原地 sorted_lst sorted(lst) # 排序返回新列表 # 切片 sub lst[1:4] # 从索引1到索引4不包括功能C#Python添加末尾Add()append()插入Insert()insert()删除Remove()/RemoveAt()remove()/del/pop()包含Contains()in运算符查找IndexOf()index()排序Sort()sort()切片GetRange()lst[1:4]Python 的in运算符比 C# 的Contains()方法简洁多了——3 in lstvslist.Contains(3)。列表推导式C# 的 LINQvar numbers new Listint { 1, 2, 3, 4, 5 }; // 过滤 var even numbers.Where(x x % 2 0).ToList(); // 转换 var squares numbers.Select(x x * x).ToList(); // 过滤 转换 var evenSquares numbers .Where(x x % 2 0) .Select(x x * x) .ToList(); // 聚合 int sum numbers.Sum(); double avg numbers.Average(); int max numbers.Max(); int min numbers.Min();Python 的列表推导式numbers [1, 2, 3, 4, 5] # 过滤 even [x for x in numbers if x % 2 0] # 转换 squares [x * x for x in numbers] # 过滤 转换 even_squares [x * x for x in numbers if x % 2 0] # 聚合用内置函数 total sum(numbers) avg sum(numbers) / len(numbers) maximum max(numbers) minimum min(numbers)Python 的列表推导式[x * x for x in numbers if x % 2 0]一行代码顶 C# 的Where().Select().ToList()。语法更简洁可读性更强。常用操作对比功能C#Python长度list.Countlen(list)排序list.Sort()list.sort()排序新列表list.OrderBy(x x).ToList()sorted(list)反转list.Reverse()list.reverse()反转新列表list.OrderByDescending(x x).ToList()list[::-1]去重list.Distinct().ToList()list(set(list))合并list1.Concat(list2).ToList()list1 list2重复Enumerable.Repeat(0, 5).ToList()[0] * 5判断为空list.Count 0not lst或len(lst) 0判断非空list.Count 0lst隐式布尔Python 的list list直接合并C# 得用Concat()。Python 的[0] * 5直接重复C# 得用Enumerable.Repeat()。列表作为栈和队列# Python 列表作为栈LIFO stack [] stack.append(1) # 入栈 stack.append(2) stack.append(3) top stack.pop() # 出栈3 top stack.pop() # 出栈2 # Python 列表作为队列FIFO但效率低 queue [] queue.append(1) # 入队 queue.append(2) first queue.pop(0) # 出队1效率低 # 更好的队列实现 from collections import deque queue deque() queue.append(1) # 入队 queue.append(2) first queue.popleft() # 出队1高效Python 的列表可以当栈用appendpop但当队列用效率低pop(0)是 O(n)。想高效当队列用得用deque。设计哲学C# 的哲学是多种集合——Array、List、Queue、Stack 等各有用途类型安全LINQ 强大。Python 的哲学是统一容器——一个list搞定大部分场景简洁语法列表推导式一行代码解决问题。C# 的集合是专用工具每种场景都有专门的工具 Python 的列表是瑞士军刀一个工具搞定大部分场景。更深层的原因C# 的集合体系是面向对象的设计每种集合都有专门的类Python 的集合体系是鸭子类型的设计只要实现迭代协议就行真实场景在数据分析中Python 的列表推导式非常强大# 从 CSV 读取数据并转换 data [] with open(sales.csv) as f: for line in f: row line.strip().split(,) data.append({ product: row[0], amount: float(row[1]), quantity: int(row[2]) }) # 一行代码计算总销售额 total sum(item[amount] * item[quantity] for item in data)C# 得这样写var data File.ReadLines(sales.csv) .Select(line line.Split(,)) .Select(parts new { Product parts[0], Amount double.Parse(parts[1]), Quantity int.Parse(parts[2]) }) .ToList(); var total data.Sum(item item.Amount * item.Quantity);Python 的列表推导式更简洁C# 的 LINQ 更易读。迁移指南C# 开发者最容易犯的错以为 Python 有固定数组Python 只有动态列表忘记列表是引用类型赋值不会复制用copy()或[:]以为pop(0)高效Python 列表的pop(0)是 O(n)用deque忘记列表推导式Python 的杀手锏一行代码顶十行以为 Python 没有泛型Python 3.12 支持泛型语法推荐工具用 VS Code Python 插件它会帮你检查列表操作的常见错误。坑点提醒列表是引用类型——赋值不会复制a [1, 2, 3] b a # b 和 a 指向同一个列表 b.append(4) print(a) # [1, 2, 3, 4]a 也变了 # 如果要复制 b a.copy() # 浅拷贝 b a[:] # 浅拷贝 import copy b copy.deepcopy(a) # 深拷贝切片是浅拷贝——嵌套对象会被共享a [[1, 2], [3, 4]] b a[0:2] # 浅拷贝 b[0][0] 999 print(a) # [[999, 2], [3, 4]]a 也变了浅拷贝 vs 深拷贝详解import copy # 浅拷贝只复制外层内层引用共享 a [[1, 2], [3, 4]] b copy.copy(a) b[0][0] 999 print(a) # [[999, 2], [3, 4]] ← 内层被改了 # 深拷贝递归复制所有层级 a [[1, 2], [3, 4]] b copy.deepcopy(a) b[0][0] 999 print(a) # [[1, 2], [3, 4]] ← a 不受影响C# 对比// C# 的数组赋值行为一致 int[][] a { new[]{1,2}, new[]{3,4} }; int[][] b a; // 引用赋值指向同一个数组 b[0][0] 999; // a[0][0] 也变了 // C# 没有内置浅拷贝/深拷贝需要手动实现 int[][] b a.Select(r r.ToArray()).ToArray(); // 浅拷贝复制外层 // C# 的 MemberwiseClone() 也只是浅拷贝操作PythonC#引用赋值b avar b a浅拷贝copy.copy(a)/a[:]/a.copy()MemberwiseClone()深拷贝copy.deepcopy(a)无内置需序列化或手写记住Python 的a.copy()和a[:]都是浅拷贝。嵌套列表必须用copy.deepcopy()。remove 只删除第一个lst [1, 2, 3, 2, 1] lst.remove(2) print(lst) # [1, 3, 2, 1]只删除了第一个 2一句话总结Python 的列表推导式[x*2 for x in list]是真正的一行代码解决问题。下一篇咱们来聊聊字典和集合——Python 的dict.get(key, default)比 C# 的TryGetValue简洁太多了。代码仓库GitHubhttps://github.com/LadyKiller1025/csharp-python-demosGiteehttps://gitee.com/qakjhzx/csharp-python-demos 欢迎点赞、收藏、转发你的支持是我持续创作的动力