首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一行代码搞定的事,你却写了100行

一行代码搞定的事,你却写了100行

作者头像
用户11081884
发布2026-07-20 20:32:59
发布2026-07-20 20:32:59
340
举报

code review 代码,功能是“读取 CSV 文件,过滤掉空行,转成字典列表”。

写了 87 行。

我盯着屏幕看了三秒,敲了一行看实现的功能一样:

代码语言:javascript
复制
data = [dict(r) forrincsv.DictReader(open("data.csv")) ifany(r.values())]

今天把这种“能用一行解决,却写了一百行”的场景全部整理出来。每一条都是我真实踩过的,或者 review 时亲眼见过的。


1. 读取文件全部内容

新手写法(12行):

代码语言:javascript
复制
defread_file(path):
    result = ""
    withopen(path, 'r', encoding='utf-8') asf:
        lines = f.readlines()
        forlineinlines:
            result += line
    returnresult

一行搞定:

代码语言:javascript
复制
content = open("file.txt", encoding="utf-8").read()

with 语句虽然更规范(能自动关文件),但如果你只是临时读个文件脚本,一行足以。


2. 列表去重但保持顺序

新手写法(9行):

代码语言:javascript
复制
defdedupe(items):
    seen = set()
    result = []
    foriteminitems:
        ifitemnotinseen:
            seen.add(item)
            result.append(item)
    returnresult

一行搞定:

代码语言:javascript
复制
result = list(dict.fromkeys(items))

dict.fromkeys() 按插入顺序保留 key,Python 3.7+ 字典是有序的,去重同时保序一步到位。


3. 扁平化嵌套列表

新手写法(8行):

代码语言:javascript
复制
defflatten(nested):
    result = []
    forsublistinnested:
        foriteminsublist:
            result.append(item)
    returnresult

一行搞定:

代码语言:javascript
复制
flat = [itemforsublistinnestedforiteminsublist]

嵌套列表推导,读两遍就习惯了。如果是多层嵌套(三维以上)用 itertools.chain

代码语言:javascript
复制
importitertools
flat = list(itertools.chain.from_iterable(nested))

4. 交换两个变量

新手写法(3行):

代码语言:javascript
复制
temp = a
a = b
b = temp

一行搞定:

代码语言:javascript
复制
a, b = b, a

这是 Python 最基本的语法糖,但真有不少人不知道。我在面试里问过,有人当场愣住。


5. 反转字符串/列表

新手写法(7行):

代码语言:javascript
复制
defreverse_string(s):
    result = ""
    foriinrange(len(s)-1, -1, -1):
        result += s[i]
    returnresult

一行搞定:

代码语言:javascript
复制
reversed_s = s[::-1]

切片 [::-1] 是 Python 里最优雅的反转操作。列表也一样:lst[::-1]


6. 查找列表中出现最多的元素

新手写法(14行):

代码语言:javascript
复制
defmost_common(items):
    counts = {}
    foriteminitems:
        counts[item] = counts.get(item, 0) +1
    max_count = 0
    result = None
    foritem, countincounts.items():
        ifcount>max_count:
            max_count = count
            result = item
    returnresult

一行搞定:

代码语言:javascript
复制
fromcollectionsimportCounter
result = Counter(items).most_common(1)[0][0]

Counter 是标准库里最被低估的工具之一。统计词频、投票结果、日志分析,全能用上。


7. 合并两个字典

新手写法(6行):

代码语言:javascript
复制
defmerge_dicts(d1, d2):
    result = {}
    fork, vind1.items():
        result[k] = v
    fork, vind2.items():
        result[k] = v
    returnresult

一行搞定(Python 3.9+):

代码语言:javascript
复制
merged = d1|d2

更早版本用 merged = {**d1, **d2},同样一行。


8. 获取字典中某个 key 的值(带默认值)

新手写法(4行):

代码语言:javascript
复制
if"name"inuser:
    name = user["name"]
else:
    name = "匿名"

一行搞定:

代码语言:javascript
复制
name = user.get("name", "匿名")

get() 第二个参数是默认值,不存在时不会抛 KeyError。


9. 判断所有/任意元素满足条件

新手写法(8行):

代码语言:javascript
复制
defall_positive(nums):
    forninnums:
        ifn<= 0:
            returnFalse
    returnTrue

一行搞定:

代码语言:javascript
复制
all_positive = all(n>0forninnums)
any_positive = any(n>0forninnums)

all()any() 配合生成器表达式,干净得不行。


10. 同时遍历索引和元素

新手写法(4行):

代码语言:javascript
复制
i = 0
foriteminitems:
    print(i, item)
    i += 1

一行搞定:

代码语言:javascript
复制
fori, iteminenumerate(items):
    print(i, item)

enumerate() 还能指定起始索引:enumerate(items, start=1) 让序号从 1 开始。


11. 将列表切分成固定大小的组

新手写法(9行):

代码语言:javascript
复制
defchunk(lst, size):
    result = []
    foriinrange(0, len(lst), size):
        result.append(lst[i:i+size])
    returnresult

一行搞定(Python 3.12+):

代码语言:javascript
复制
fromitertoolsimportbatched
chunks = list(batched(lst, 3))

3.12 以下版本,用列表推导:

代码语言:javascript
复制
chunks = [lst[i:i+3] foriinrange(0, len(lst), 3)]

12. 扁平化并去重

新手写法(12行):

代码语言:javascript
复制
defflatten_and_dedupe(nested):
    result = []
    seen = set()
    forsublistinnested:
        foriteminsublist:
            ifitemnotinseen:
                seen.add(item)
                result.append(item)
    returnresult

一行搞定:

代码语言:javascript
复制
importitertools
result = list(dict.fromkeys(itertools.chain.from_iterable(nested)))

链式调用,从左到右读一遍就懂。


13. 计算阶乘

新手写法(7行):

代码语言:javascript
复制
deffactorial(n):
    result = 1
    foriinrange(1, n+1):
        result *= i
    returnresult

一行搞定:

代码语言:javascript
复制
importmath
result = math.factorial(n)

别自己写阶乘,标准库有,而且是 C 实现的,快得多。


14. 判断是否是回文

新手写法(7行):

代码语言:javascript
复制
defis_palindrome(s):
    foriinrange(len(s)//2):
        ifs[i] != s[len(s)-1-i]:
            returnFalse
    returnTrue

一行搞定:

代码语言:javascript
复制
is_palindrome = s == s[::-1]

切片反转比对,回文判断的终极答案。


15. 统计文件中每个单词的出现次数

新手写法(20行+):

代码语言:javascript
复制
defcount_words(path):
    result = {}
    withopen(path) asf:
        forlineinf:
            words = line.split()
            forwordinwords:
                word = word.lower().strip(".,!?")
                result[word] = result.get(word, 0) +1
    returnresult

核心逻辑一行搞定:

代码语言:javascript
复制
fromcollectionsimportCounter
importre
counts = Counter(re.findall(r"\w+", open("file.txt").read().lower()))

几句话说在后面

写 Python 这几年,我对“一行代码”这件事的看示变了好几次。

刚学的时候觉得写一行很酷,刻意把各种逻辑挤到一起,结果同事看我的代码像看天书。后来走另一个极端,什么都拆开写,明明一行能搞定的事硬写十行,美其名曰“可读性”。

现在觉得,标准库提供的方法,能用就用。上面 15 个例子里 10 个用的是标准库,多看 itertoolscollectionsfunctools 的文档,能省大量时间。

但别为了短而短。有人喜欢把十行逻辑硬挤成一行,那不叫优雅,叫难维护。我见过最长的一行有 247 个字符,改 bug 的时候骂了一整天。

“无他,惟手熟尔”!有需要的用起来!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 读取文件全部内容
  • 2. 列表去重但保持顺序
  • 3. 扁平化嵌套列表
  • 4. 交换两个变量
  • 5. 反转字符串/列表
  • 6. 查找列表中出现最多的元素
  • 7. 合并两个字典
  • 8. 获取字典中某个 key 的值(带默认值)
  • 9. 判断所有/任意元素满足条件
  • 10. 同时遍历索引和元素
  • 11. 将列表切分成固定大小的组
  • 12. 扁平化并去重
  • 13. 计算阶乘
  • 14. 判断是否是回文
  • 15. 统计文件中每个单词的出现次数
  • 几句话说在后面
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档