Python 列表生成式 能不能实现筛选一个列表判断条件 拆成两个列表

2018-03-06 12:18:13 +08:00
 jakeyfly

l = [1,2,3,4,5,6,7,8,9]

这个列表 能不能用列表生成式 只写一行拆成大于 5 的 跟小于等于 5 的 两个列表

我只知道 x = [x for in l if x >5 ]

能不能写一行 x,y = [xxxxxxxxxxxx]

这样???

2796 次点击
所在节点    问与答
10 条回复
ctro15547
2018-03-06 12:27:58 +08:00
x,y = [[x for x in l if x > 5 ],[y for y in l if y <= 5]]
#[6, 7, 8, 9] [1, 2, 3, 4, 5]
哈哈哈笨办法
jakeyfly
2018-03-06 12:31:25 +08:00
@ctro15547 大佬 66666
jakeyfly
2018-03-06 12:31:49 +08:00
@ctro15547 不过 这个办法跟写两行 也没区别哈
prolic
2018-03-06 13:17:45 +08:00
x,y = map(lambda y: filter(lambda z:z,list(y)),zip(*[(x,None) if x > 5 else (None,x) for x in l]))
Kilerd
2018-03-06 13:39:09 +08:00
@jakeyfly 事实上 1L 的写法会比写两行慢,因为涉及到一个解包的过程。
jasonailu
2018-03-06 13:59:51 +08:00
x, y = [[x for x in l if func(x)] for func in (lambda x:x<=5, lambda x:x>5)]
hbkdsm
2018-03-06 14:02:00 +08:00
Readability counts;
Write plain code, not clever code
jakeyfly
2018-03-06 15:09:10 +08:00
楼上大佬们都太 6 了 不过这样定 阅读性太差了 我还是老实的 FOR 循环吧
jakeyfly
2018-03-06 15:12:35 +08:00
@hbkdsm i think so too
ctro15547
2018-03-19 08:26:16 +08:00
l = [1,2,3,4,5,6,7,8,9]
x,y = [filter(lambda k: k > 4, l), filter(lambda k: k <= 4, l)]

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/435276

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX