Nic*_*ick 15 python split list-comprehension
首先请原谅我有点差的头衔.我不太确定如何说出来.如果有人可以建议一个更好的标题.
我试图找出是否有一种方法只将列表推导的每次迭代的值拆分一次,但在输出中使用它两次.我试图解决的问题的一个例子是:
我有字符串
a = "1;2;4\n3;4;5"
Run Code Online (Sandbox Code Playgroud)
我想执行此操作:
>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
Run Code Online (Sandbox Code Playgroud)
无需分三次运行拆分.所以这样的事情(这显然是无效的语法,但希望足以传达消息):
[(x[1],x[2]) for x.split(";") in a.split("\n") if x[1] != 5]
Run Code Online (Sandbox Code Playgroud)
在这个问题中,我不是在寻找获得字符串第2和第3列的奇特方法.这只是提供具体例子的一种方式.我当然可以使用示例:
[x.split(";")[1:3] for x in a.split("\n")]
Run Code Online (Sandbox Code Playgroud)
我想到的可能的解决方案:
csv.DictReader,命名我的列和类似的东西StringIO给它输入.这大部分都是一个很好的模式,能够使用而不是一个特定的案例,所以很难回答"你为什么要这样做"或"这是什么"的问题
更新:在阅读下面的解决方案后,我去了一些速度测试.我在我的基本测试中发现,所提供的解决方案比上面的天真解决方案快35%.
ric*_*t1k 23
您可以使用包含在生成器表达式中的列表推导:
[(x[1],x[2]) for x in (x.split(";") for x in a.split("\n")) if x[1] != 5]
Run Code Online (Sandbox Code Playgroud)
开始Python 3.8,并引入赋值表达式(PEP 572)(:=运算符),可以在列表推导式中使用局部变量以避免两次调用相同的表达式:
在我们的例子中,我们可以将 的评估命名line.split(';')为变量,parts同时使用表达式的结果过滤列表 ifparts[1]不等于5; 从而重新使用parts以生成映射值:
# text = '1;2;4\n3;4;5'
[(parts[1], parts[2]) for line in text.split('\n') if (parts := line.split(';'))[1] != 5]
# [('2', '4'), ('4', '5')]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10016 次 |
| 最近记录: |