楼主: 李浩泉
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Python/Perl] Coding也是有颜值的,刷题的时候保持颜值在线很重要

🔗
daydream1 2020-8-7 13:07:13 | 只看该作者
全局:
本帖最后由 daydream1 于 2020-8-7 13:47 编辑

numbers.count(x)的问题楼上都说了,你的最佳解实际上时间复杂度是n^2*logn。除此之外:
1. 像下面这样的one-liner牺牲了太多可读性。楼主还记得Python的设计哲学之一——可读性吧?业界也不鼓励可读性差的代码
  1. return sorted(sorted(numbers), key=lambda x: numbers.count(x), reverse=True)
复制代码

2. 两个嵌套的sorted也不是相当于创建了两个lists吗?而且sorted(nums)的意义在于什么?浪费n*logn的时间复杂度,完全可以只用一个sorted解决。

如果让我来写:
  1. from Collections import Counter
  2. def solution(nums):
  3.     num_count = Counter(nums)
  4.     return sorted(nums, key = lambda num: num_count[num], reverse = True)
  5.     # 如果允许修改原本的nums,直接nums.sort() 也行        
  6.     # 这道题我假设是保留重复的元素,实际面试时应当先clarify是否需要保留重复元素
复制代码


补充:
楼主clarify题目以后,我发现sorted(nums)确实有意义,可以保留。如果不想排序两次可以通过别的一些方法来实现仅排序一次.

评分

参与人数 1大米 +1 收起 理由
李浩泉 + 1 欢迎继续点评

查看全部评分

回复

使用道具 举报

🔗
 楼主| 李浩泉 2020-8-7 13:28:46 | 只看该作者
全局:
本帖最后由 李浩泉 于 2020-8-7 13:31 编辑
daydream1 发表于 2020-8-7 13:07
numbers.count(x)的问题楼上都说了。除此之外:
1. 像下面这样的one-liner牺牲了太多可读性。楼主还记得Py ...

sorted(nums)的意义在于 体现 SQL order by 2 asc,如果题目改动一下,数量相等的时候倒叙排列,

return sorted(sorted(nums,reverse = True), key = lambda num: num_count[num], reverse = True)

感谢你的评论,喜欢你的风格,写code直接说。欢迎继续点评!!!

我也是刚刚自学Python,仅仅不到2个月,不是很熟悉 from collections import 这些组件


评分

参与人数 1大米 +2 收起 理由
daydream1 + 2 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| 李浩泉 2020-8-7 13:58:38 | 只看该作者
全局:
本帖最后由 李浩泉 于 2020-8-7 14:21 编辑

下面这样的one-liner牺牲了太多可读性。楼主还记得Python的设计哲学之一 可读性吧?


我是一个初学者,做了快7年的BI报表和SQL,现在开始学coding,主要是为了应聘DE职位。

我找了几个现职的DE和SDE教我,我刚刚学了【Python 列表推导式】。

大家都推荐我尽量使用列表推导式,第一运算效率更高(为什么效率高,谁能解释一下?我是看计算机测速的时候发现这种写法运行时间短),第二看起来简洁清楚。他们说专业的人员都是这么。

  1. [x*y for x in range(1,5) if x > 2 for y in range(1,4) if y < 3]
复制代码



常规写法,也是之前我的写法

  1. for x in range(1,5)
  2.     if x > 2
  3.         for y in range(1,4)
  4.             if y < 3
  5.                 x*y
复制代码



回复

使用道具 举报

🔗
 楼主| 李浩泉 2020-8-7 14:09:39 | 只看该作者
全局:
本帖最后由 李浩泉 于 2020-8-7 14:20 编辑

关于 from collections import Counter 和 count() 效率问题


从理论上讲, Counter速度更快,但是固定开销更高,现代Python上的Counter使用C加速器来加速计数,但是只有在iterable足够长时,该加速器才有好处 。 对于任何数量的唯一事物, Counter仍为O(n) ; 每次调用调用.count是O(n) ,但是如果您需要知道输入中每个唯一事物的计数,对于大多数唯一的输入,每个单独的.count调用将渐近为O(n2) 。

简单说:

nums = [5, 3, 8, 11, 5, 6, 6, 5]

如果只统计数列中一个元素(5)的个数,用count()会更好,或者说不差。但是如果对整个数列所有元素统计个数,一定要使用Counter容器。

回复

使用道具 举报

🔗
daydream1 2020-8-8 02:58:49 | 只看该作者
全局:
李浩泉 发表于 2020-8-7 13:58
下面这样的one-liner牺牲了太多可读性。楼主还记得Python的设计哲学之一 可读性吧?

列表推导式的使用没有问题。问题不在于是不是one-liner,而在于代码的可读性。oneliner也有可读性非常好的代码,多行代码可读性也可以很差。
回复

使用道具 举报

🔗
 楼主| 李浩泉 2020-8-10 05:47:40 | 只看该作者
全局:
刷DE面试鸡精,还真发现了一道题,用到了Counter,完美的一句话答案。请大家点评:

  1. '''
  2. 找出字符串s="aaabbbccceeefff111144444"中,字符出现次数最多的字符
  3. '''

  4. s = "aaabbbccceeefff111144444"

  5. output: 4

  6. from collections import Counter

  7. def helper(s):
  8.     return sorted(list(Counter(list(s)).items()),key=lambda x:x[1], reverse = True)[0][0]
  9.    
  10. print(helper(s))
复制代码


回复

使用道具 举报

🔗
vvqqdd 2020-8-12 09:54:33 | 只看该作者
全局:
没看到哪里在讨论颜值啊
回复

使用道具 举报

🔗
wangdiao01 2020-8-12 17:11:17 | 只看该作者
全局:
建议进一个大公司然后多参与几次3人以上的code review,
回复

使用道具 举报

🔗
nlackx 2020-8-12 23:04:27 | 只看该作者
全局:
wangdiao01 发表于 2020-8-12 01:11
建议进一个大公司然后多参与几次3人以上的code review,

哪些点你不同意?1-liner?
回复

使用道具 举报

🔗
MinionJosh 2020-8-13 03:23:52 | 只看该作者
全局:
本帖最后由 MinionJosh 于 2020-8-13 03:29 编辑
李浩泉 发表于 2020-8-10 05:47
刷DE面试鸡精,还真发现了一道题,用到了Counter,完美的一句话答案。请大家点评:

[mw_shl_code=python ...

都用Counter了,怎模不用 .most_common呢?
```
return Counter(s).most_common()[0][0]
```
還有str 已經是 iterable, 所以不用轉成 list

评分

参与人数 1大米 +1 收起 理由
李浩泉 + 1 多谢!又学了一招!!!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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