列表理解中的多个变量?

Dav*_*ave 14 python list-comprehension

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

输入:

inputs = ["1, foo, bar", "2, tom, jerry"]
Run Code Online (Sandbox Code Playgroud)

期望的输出:

[[1, "foo", "bar"], [2, "tom", "jerry"]]
Run Code Online (Sandbox Code Playgroud)

在理解中拆分字符串很简单:

>>> [s.split(",") for s in inputs]
[['1', ' foo', ' bar'], ['2', ' tom', ' jerry']]
Run Code Online (Sandbox Code Playgroud)

但是我很难弄清楚在理解之后字符串被拆分后如何访问列,​​因为它似乎需要一个变量赋值.以下是有效的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]
Run Code Online (Sandbox Code Playgroud)

有没有办法在理解中分配变量,以便输出可以由变量的函数组成?循环是微不足道的,但通过转换输入生成列表肯定看起来像是一个"理解 - 任务"任务.

outputs = []
for s in inputs:
    x,y,z = s.split(",")
    outputs.append([int(x), y.strip(), z.strip()])
Run Code Online (Sandbox Code Playgroud)

kin*_*all 20

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

[[int(x), y.strip(), z.strip()] for s in inputs for (x, y, z) in [s.split(",")]]
Run Code Online (Sandbox Code Playgroud)

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

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


Dav*_*ave 7

感谢所有建议 - 很高兴看到各种可能的技术,以及 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
Run Code Online (Sandbox Code Playgroud)

结果:

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']]
Run Code Online (Sandbox Code Playgroud)