列表理解中的多变量?

2024-04-24 11:54:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从多字段字符串列表中创建一个列表列表,并想知道在理解中是否可以这样做。

输入:

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()])

Tags: 字符串in列表forfoo过程baroutputs
3条回答

您可以使用列表理解中的两个for子句来完成此操作。第一个遍历列表中的项。第二个遍历包含从拆分字符串派生的列表的单个项列表(这是必需的,因此我们可以将其解压为三个单独的变量)。

[[int(x), y.strip(), z.strip()] for s in inputs for (x, y, z) in [s.split(",")]]

for子句的顺序有些违反直觉,但它与您将其编写为嵌套的for循环的方式相匹配。

Jon Sharpe使用嵌套理解(实际上是生成器表达式)是类似的,而且可能更清楚。使用多个for子句似乎总是让我感到困惑;我主要想看看是否可以在这里使用它。

你可以使用带列表理解的地图

def clean(x):
   return [int(x[0]), x[1].strip(), x[2].strip()]

map(clean,[s.split(",") for s in inputs])
# Output: [[1, 'foo', 'bar'], [2, 'tom', 'jerry']]

使用lambda函数:

map(lambda x: [int(x[0]), x[1].strip(), x[2].strip()],[s.split(",") for s in inputs])

感谢所有的建议-很高兴看到各种可能的技术,以及Python的禅的反例“应该有一个-最好只有一个-显而易见的方法来做到这一点”

所有4种解决方案都同样漂亮,因此只给其中一种方案开出令人垂涎的绿色支票有点不公平。我同意建议,1是最干净和最好的方法。#2也很容易理解,但是在理解中使用lambda似乎有点离谱。#3在创建带map的迭代器方面很好,但是由于需要在上面迭代的额外步骤而得到了一个小小的缺点。#4很酷地指出嵌套for是可能的——如果我能记住它们是按照“第一,第二”的顺序排列的,而不是“内部,外部”。因为“1”不是答案的形式,所以“4”得到了最令人惊讶的检查。

再次感谢大家。

inputs = ["1, foo, bar", "2,tom,  jerry"]

outputs1 = [[int(x), y.strip(), z.strip()] for x,y,z in (s.split(',') for s in inputs)]
print("1:", outputs1)       # jonrsharpe

outputs2 = [(lambda x, y, z: [int(x), y.strip(), z.strip()])(*s.split(",")) for s in inputs]
print("2:", outputs2)       # yper

outputs3 = [z for z in map(lambda x: [int(x[0]), x[1].strip(), x[2].strip()],[s.split(",") for s in inputs])]
print("3:", outputs3)       # user2314737

outputs4 = [[int(x), y.strip(), z.strip()] for s in inputs for (x, y, z) in [s.split(",")]]
print("4:", outputs4)       # kindall

结果:

1: [[1, 'foo', 'bar'], [2, 'tom', 'jerry']]
2: [[1, 'foo', 'bar'], [2, 'tom', 'jerry']]
3: [[1, 'foo', 'bar'], [2, 'tom', 'jerry']]
4: [[1, 'foo', 'bar'], [2, 'tom', 'jerry']]

相关问题 更多 >