Python中合并列表推导式

3

是否有可能将以下Python列表综合表达式组合成一行?我知道这并不是必要的,我只是好奇。

rows = [row.split() for row in data]
flattened = [float(val) for sublist in rows for val in sublist]

以下是数据文件的片段:
['  -.2098335E-03  -.2108988E-03  -.2119629E-03  -.2130240E-03  -.2140826E-03', '  -.2151421E-03  -.2161973E-03  -.2172531E-03  -.2183025E-03  -.2193489E-03', '  -.2203825E-03  -.2214097E-03  -.2224521E-03  -.2235475E-03  -.2246843E-03'....]

我正在尝试提取每个字符串并创建一个数字列表。上述代码目前已经实现了该功能,我希望看到它能否进一步简化。

谢谢!


你能举个例子说明 data 是什么吗? - Luke Storry
2
这有帮助吗?[float(val) for sublist in [row.split() for row in data] for val in sublist] - DirtyBit
1
请编辑您的问题,包括您的数据、您想要获得的输出以及您已经完成的工作。 - Adhun Thalekkara
5个回答

2

由于sublist是您的row.split(),因此只需替换即可。

data = ['0.3 0.6 0.9', '0.1 0.4 0.3']

flattened = [float(val) for row in data for val in row.split()]

print(flattened) #[0.3, 0.6, 0.9, 0.1, 0.4, 0.3]

如果我们扩展它,就会更加清晰。
data = ['0.3 0.6 0.9', '0.1 0.4 0.3']

#the generator is identically replacing this part
flattened = list()
for row in data:
    for val in row.split():
        flattened.append(float(val))

所有建议以下解决方案的答案,都试图用内容循环包装源循环。
#               v--contents--v      wrapping       v--source       
[float(val) for sublist in (row.split() for row in data) for val in sublist] 

应该反过来。
[float(val) for row in data for val in row.split()]

1
你可以使用[float(val) for sublist in (row.split() for row in data) for val in sublist],但是将它们分开写更易读(也更容易在未来调试)。

1

嵌套列表推导

嵌套列表推导就是在一个列表推导中再嵌套另一个列表推导,这与嵌套for循环非常相似。

当我们使用列表推导现有列表的元素创建一个新列表(平方数)时,我们写:

l1=[1,2,3]
l2=[i**2 for i in l1]
print(l2)

这段文字的英译中文为:

这将给出输出


[1, 4, 9]

我们还可以在这个推导式中嵌套两个或更多的for循环。
例如:
l1=[1,2,3]
l2=[4,5,6]
l3=[[i**2,j**2] for i in l1 for j in l2]
print(l3)

输出:

[[1, 16], [1, 25], [1, 36], [4, 16], [4, 25], [4, 36], [9, 16], [9, 25], [9, 36]]

Similarly:

l1=[1,2]
l2=[3,4]
l3=[5,6]
l4=[[i,j,k] for i in l1 for j in l2 for k in l3]
print(l4)

输出:

[[1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6]]

同样地,您的代码可以使用列表推导式进行重写,如下所示:list comprehensions 的帮助下:
flattened = [float(val) for sublist in (row.split() for row in data) for val in sublist]

希望这对您有所帮助!

0
如果意图只是合并成一行,您可以使用生成器表达式(感谢@OneCricketeer),它只在需要时生成项目,并使其比列表更具内存效率。
flattened = [float(val) for sublist in (row.split() for row in data) for val in sublist]

1
我会写 (row.split() for row in data) 以避免生成第二个列表。 - OneCricketeer
@OneCricketeer 这样做不会创建一个元组吗? - DirtyBit
@DirtyBit,逗号创建元组,而不是括号。(例外情况是空元组,因为()不是有效的括号表达式。)括号只是防止逗号被解释为Python语法的其他部分(例如,在函数的参数列表中)。 - chepner
2
@DirtyBit 在推导式中使用圆括号会使其成为生成器表达式(基本上是一个不在内存中生成的列表,而是惰性评估)。请参见 https://docs.python.org/3/reference/expressions.html#generator-expressions。 - Luke Storry
1
@OneCricketeer,因此内存利用率高! - DirtyBit

0
一句话:
data = ["1 2",
        "3 4",
        "5 6",
        "7 8",
        "9 10"
        ]

rows = [float(val) for row in data for sublist in row.split() for val in sublist]
print(rows)

返回:

[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 1.0, 0.0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接