列表理解拆分循环变量

发布于 2021-01-29 16:31:04

我试图找出是否有一种方法可以将列表理解的每次迭代的值仅拆分一次,但在输出中使用两次。

作为我要解决的问题的一个示例,我有以下字符串:

a = "1;2;4\n3;4;5"

我想执行以下操作:

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]

无需运行拆分三遍。所以是这样的(这显然是无效的语法,但希望足以传达消息):

[(x[1],x[2]) for x.split(";") in a.split("\n") if x[1] != 5]

在这个问题中,我 不是 在寻找获取字符串第二和第三列的理想方法。这只是提供具体示例的一种方式。我当然可以为示例使用:

[x.split(";")[1:3] for x in a.split("\n")]

我想到的可能的解决方案:

  1. 不使用列表理解
  2. 保持原样
  3. 使用csv.DictReader,为我的列命名,并StringIO输入类似内容。

这主要是一种可以使用的好模式,而不是特定的情况,因此很难回答“您为什么要这样做”或“这是什么意思”这类问题

更新: 阅读下面的解决方案后,我去进行了一些速度测试。我在最基本的测试中发现,所提供的解决方案比上面的幼稚解决方案快35%。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使用围绕生成器表达式的列表理解:

    [(x[1],x[2]) for x in (x.split(";") for x in a.split("\n")) if x[1] != 5]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看