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

[学Python/Perl] 一些刷题常用的 python 技巧

   
🔗
只是Leon 2020-12-16 15:24:38 | 只看该作者
全局:
点赞还需要理由吗?😄
回复

使用道具 举报

🔗
只是Leon 2020-12-16 15:39:56 | 只看该作者
全局:
本帖最后由 只是Leon 于 2020-12-16 15:44 编辑

首先说,非常、十分、特别。。。感谢楼主的总结,对于苦哈哈刷题的我来说真是及时雨啊 @chancidy

另外,讨论一个技术细节问题,今天刚刚被list copy的问题折腾了半天,看到你说的关于如何sort一个list而不影响原list的部分,能解释一下为什么建议用sorted()而不是产生一个新的list (比如b = list(a)或b = list.copy())然后用b.sort()?

我觉得效果上来说应该是一样的吧?
下面是你的原文
sorted

list 自身有自带的 sort(), 但是它不返回新的 list. sorted 能返回一个新的 list, 并且支持传入参数reverse。

比如我们有一个 tuple 的数组,我们想按照 tuple 的第一个元素进行排序:

l1 = [(1,2), (0,1), (3,10) ]

l2 = sorted(l1, key=lambda x: x[0])

# l2 = [(0, 1), (1, 2), (3, 10)]
这里的 key 允许传入一个自定义参数,也可以用自带函数进行比较,比如在一个 string 数组里只想比较小写,可以传入key=str.lower

l1 = ["banana","APPLE", "Watermelon"]
l2 = sorted(l1, key=str.lower)
print(l2)

# ['APPLE', 'banana', 'Watermelon']
回复

使用道具 举报

🔗
 楼主| chancidy 2020-12-16 16:48:52 | 只看该作者
全局:
只是Leon 发表于 2020-12-16 15:39
首先说,非常、十分、特别。。。感谢楼主的总结,对于苦哈哈刷题的我来说真是及时雨啊 @chancidy

另外 ...

谢谢支持和回复,如果这个list里都是同一个类型的值,且可以sort,那么你这么做效果看起来是一样的,但主要还是两个点吧:
1. 既然sorted可以一步到位返回新的sort好的list,那么何必copy再sort呢?毕竟写python的时候大家都想尽可能pythonic一些
2. 用copy()这个其实还是一个浅拷贝,如果list元素存在循环引用的情况,那么依然有可能会影响原list,这个可以看我给出的copy和deepcopy那一块的例子

评分

参与人数 1大米 +1 收起 理由
只是Leon + 1 有道理,学习了

查看全部评分

回复

使用道具 举报

🔗
Michaellikp 2020-12-17 00:55:35 | 只看该作者
全局:
谢谢指正,这个知识点很有用
回复

使用道具 举报

🔗
只是Leon 2020-12-17 03:24:02 | 只看该作者
全局:
chancidy 发表于 2020-12-16 16:48
谢谢支持和回复,如果这个list里都是同一个类型的值,且可以sort,那么你这么做效果看起来是一样的,但主 ...

嗯,convinced 😄   刚刚试了一下果然比较好用。另外想说本来想举一反三试一下reversed但是发现reversed和sorted的功能竟然略有差别,python下一版应该统一一下 。。。。

另外顺便问一下,我一直很困惑,像下面的栗子中reversed返回的<list_reverseiterator object at 0x102bb9650>是个什么东东?我记得也有其他函数返回类似object,我查了半天还是没有特别弄明白,如果你能帮忙解释就非常感谢。
  1. >>> a
  2. [1, 2, 3, [2, 3, 8]]
  3. >>> sorted(a)
  4. Traceback (most recent call last):
  5.   File "<stdin>", line 1, in <module>
  6. TypeError: '<' not supported between instances of 'list' and 'int'
  7. >>> a
  8. [1, 2, 3, [2, 3, 8]]
  9. >>> a.pop()
  10. [2, 3, 8]
  11. >>> sorted(a)
  12. [1, 2, 3]
  13. >>> c = sorted(a)
  14. >>> c
  15. [1, 2, 3]
  16. >>> d = reversed(a)
  17. >>> d
  18. <list_reverseiterator object at 0x102bb9650>
  19. >>> list(d)
  20. [3, 2, 1]
  21. > d = list(reversed(a))
  22. >>> d
  23. [3, 2, 1]
  24. >>>
复制代码
回复

使用道具 举报

🔗
只是Leon 2020-12-20 15:48:21 | 只看该作者
全局:
只是Leon 发表于 2020-12-17 03:24
嗯,convinced 😄   刚刚试了一下果然比较好用。另外想说本来想举一反三试一下reversed但是发现re ...

后来查到了,reversed 产生的东东叫list generator,是python为了节省内存新出产的。下面是quote stack overflow的
Basically, use a generator expression if all you're doing is iterating once. If you want to store and use the generated results, then you're probably better off with a list comprehension.


source https://stackoverflow.com/questi ... -list-comprehension
回复

使用道具 举报

🔗
bogogogo 2020-12-20 16:46:51 | 只看该作者
全局:
chancidy 发表于 2019-11-25 10:49
一个typo,感谢小伙伴指出,2d array: [[0 for y in range(rows)] for x in range(cols)]

怎么感觉应该是
  1. [[0 for y in range(cols)] for x in range(rows)]
复制代码
呢? [0 for y in range(cols)] 生成每行的list (columns), 然后 [comprehension for cols for x in range(rows)]生成每一行。
麻烦楼主帮忙确认一下。谢谢。

评分

参与人数 1大米 +1 收起 理由
只是Leon + 1 抓虫很仔细,👍

查看全部评分

回复

使用道具 举报

🔗
alenzyy 2020-12-20 17:06:15 | 只看该作者
全局:
补充个

return a or b 返回小的值

return a and b 返回大的值
回复

使用道具 举报

🔗
只是Leon 2020-12-21 04:55:31 | 只看该作者
全局:
bogogogo 发表于 2020-12-20 16:46
怎么感觉应该是 [mw_shl_code=python,true][[0 for y in range(cols)] for x in ran ...
抓虫很仔细,👍
回复

使用道具 举报

🔗
只是Leon 2020-12-21 04:55:47 | 只看该作者
全局:
[quote]bogogogo 发表于 2020-12-20 16:46
怎么感觉应该是
  1. [[0 for y in range(cols)] for x in range(rows)][/mw_shl_co ...[/quote]
  2. [code]>>> cols = 3
  3. >>> rows = 2
  4. >>> a = [[0 for y in range(cols)] for x in range(rows)]
  5. >>> a
  6. [[0, 0, 0], [0, 0, 0]]
  7. >>>
复制代码
回复

使用道具 举报

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

本版积分规则

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