查看: 8197| 回复: 52
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Python/Perl] 聊一些Python的坑,刷题的时候值得注意

 
🔗
LPT | 只看该作者 |倒序浏览
全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
Python刷题的技巧地里总结的很多了,我刷了几天题,聊一下遇到的坑。抛砖引玉,如果我对Python的理解有问题,麻烦指正。:)

1. collections.Counter
这个utils看起来很有用,其实挺废的。几个method的入参和名字都非常不好记。而且,这个utils最坑的地方在于:你用字符串当key试试 :)


  1. a = ["tom", "jerry"]
  2. c = Counter()
  3. for w in a:
  4.     c.update(w)
  5. print(list(c))
复制代码


这个输出是:
['t', 'o', 'm', 'j', 'e', 'r', 'y']

你如果需要更新字符串的key,那得写成
for w in a:
    c.update({w: 1})

这个类真是非常鸡肋,建议压根别用。换collections.defaultdict然后给个int类型,代码多不了几行。

2. 二维数组

比如初始化一维数组,你可能会这么写:

  1. arr = [0] * 5
  2. for i in range(0, 5):
  3.     arr[i] = i
  4. print(arr)
复制代码


那么初始化二维数组呢?这么写吧:
  1. arr2 = [[0] * 5] * 5
  2. print(arr2)
  3. for i in range(0, 5):
  4.     for j in range(0, 5):
  5.         arr2[i][j] = i
  6. print(arr2)
复制代码


你猜猜结果是啥
[[4, 4, 4, 4, 4], [4, 4, 4, 4, 4], [4, 4, 4, 4, 4], [4, 4, 4, 4, 4], [4, 4, 4, 4, 4]]

解决方法: 永远不要用这种写法。老老实实写Lambda。
arr2 = [[0 for i in range(5)] for j in range(5)]

3. For-Else 和 While-Else
没错,Python支持这个非常奇怪的语法。没什么用,容易出错,也很难理解。IMHO看见这种代码也不要学,小心面试官一看直接当错误答案处理了。






补充内容 (2020-10-31 23:11):
坑:指的就是反直觉的行为,AKA新手杀。比如:
Java里面的 "a" == "a"
JavaScript里面的this
Ruby里面的return

补充内容 (2020-11-1 01:49):
刚注意到,论坛好像把非代码块里文本里的括号会过滤掉,上面的代码很神奇的还能执行,但不是LZ想说的问题了。在28楼用代码块重新写了。抱歉。 :)[/i][/i]

评分

参与人数 5大米 +13 收起 理由
dreamdriver + 2 给你点个赞!
sanmao0715 + 1 赞一个
aranne + 1 赞一个
14417335 + 8
Segfault2Race + 1 赞一个

查看全部评分


上一篇:谁知道2020年leetcode啥时候开始感恩节促销吗?
下一篇:863题的DFS 解法,附上代码
全局:
建议回炉重造 你说的这些问题都是你自己的问题

评分

参与人数 1大米 +1 收起 理由
yjjw + 1 大实话

查看全部评分

回复

使用道具 举报

全局:
我遇到最大的坑是dictionary,面试时千万别取什么my_dict,your_dict这样的变量名。至于为啥,等你和面试官热火朝天地讨论问题时你就知道了

补充内容 (2020-10-31 20:53):
说个正经的,python3.9支持merge dictionaries了

评分

参与人数 6大米 +7 收起 理由
只是Leon + 1 这么欢乐的贴给大米是必须的😄
Mars + 1 赞一个
ningquanwang + 2 很有用的信息!
花猪蹄 + 1 赞一个
kellyrxw + 1 赞一个

查看全部评分

回复

使用道具 举报

全局:
难道不应该直接c = Counter(a)?

回复

使用道具 举报

全局:
我不同意。Counter在刷题时很好用的,有很多题用Counter解会少好几行代码,而且更不容易出错。比如,当一个entry已经是0了,你再-1,它还是0,不会变负数。
回复

使用道具 举报

🔗
jollibeeee 2020-10-31 16:14:28 | 只看该作者
全局:
用python刷了100+题 我也感觉我用Counter挺不顺手的... 虽然用的确可以写出一些pythonic的代码 不过我觉得一位数组初始化和for-else都是挺pythonic和方便的
回复

使用道具 举报

🔗
testcpp 2020-10-31 20:38:35 来自APP | 只看该作者
全局:
都用了counter了,还for循环干嘛呢?
回复

使用道具 举报

全局:
你直接c=Counter(a)啊!而且你想改的话,直接c[key]=9,这么改就行了啊!不要太方便哦……还有一维数组赋值不是应该arr[i]=i吗?arr是个数组,你直接赋值数字?同样,二维数组arr[i][j]=i,你不加i当然就是赋值最后一个index4,但奇怪的是你用list comprehension时候又加上了!

补充内容 (2020-10-31 21:15):
又看了一下,楼主应该就是想要每个行赋值同一个数,这样的话你初始化要这么写 a = [[0]*5 for i in range(5)],否则的话每一行的数列是同时变化的。你直接用[0,0,0]*3,改任意一行,其他行会跟着变。
回复

使用道具 举报

🔗
pubgirl 2020-10-31 21:22:10 来自APP | 只看该作者
全局:
为什么我从来没有在python上初始化过什么数组。。。不都是把一维的直接reshape吗。。。菜鸡飘过
回复

使用道具 举报

全局:
Counter超好用啊😂各种defaultdict,OrderedDict, most_common(1), deque ...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表