我想从多字段字符串列表中创建一个列表列表,并想知道在理解中是否可以这样做。
输入:
inputs = ["1, foo, bar", "2, tom, jerry"]
期望输出:
[[1, "foo", "bar"], [2, "tom", "jerry"]]
在理解过程中拆线很容易:
>>> [s.split(",") for s in inputs]
[['1', ' foo', ' bar'], ['2', ' tom', ' jerry']]
但是,在理解中拆分字符串之后,我很难找出如何访问列,因为它似乎需要一个变量赋值。以下不是有效的Python,但说明了我要查找的内容:
[[int(x), y.strip(), z.strip() for x,y,z = s.split(",")] for s in inputs]
or
[[int(v[0]), v[1].strip(), v[2].strip() for v = s.split(",")] for s in inputs]
有没有办法在理解中分配变量,以便输出可以由变量的函数组成?循环是很简单的,但是通过转换输入生成一个列表看起来确实是一个“理解性”的任务。
outputs = []
for s in inputs:
x,y,z = s.split(",")
outputs.append([int(x), y.strip(), z.strip()])
您可以使用列表理解中的两个
for
子句来完成此操作。第一个遍历列表中的项。第二个遍历包含从拆分字符串派生的列表的单个项列表(这是必需的,因此我们可以将其解压为三个单独的变量)。for
子句的顺序有些违反直觉,但它与您将其编写为嵌套的for
循环的方式相匹配。Jon Sharpe使用嵌套理解(实际上是生成器表达式)是类似的,而且可能更清楚。使用多个
for
子句似乎总是让我感到困惑;我主要想看看是否可以在这里使用它。你可以使用带列表理解的地图
使用lambda函数:
感谢所有的建议-很高兴看到各种可能的技术,以及Python的禅的反例“应该有一个-最好只有一个-显而易见的方法来做到这一点”
所有4种解决方案都同样漂亮,因此只给其中一种方案开出令人垂涎的绿色支票有点不公平。我同意建议,1是最干净和最好的方法。#2也很容易理解,但是在理解中使用lambda似乎有点离谱。#3在创建带map的迭代器方面很好,但是由于需要在上面迭代的额外步骤而得到了一个小小的缺点。#4很酷地指出嵌套for是可能的——如果我能记住它们是按照“第一,第二”的顺序排列的,而不是“内部,外部”。因为“1”不是答案的形式,所以“4”得到了最令人惊讶的检查。
再次感谢大家。
结果:
相关问题 更多 >
编程相关推荐