繁体   English   中英

在 Python 中合并列表推导

[英]Merging list comprehensions in Python

是否可以将以下 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'....]

我正在尝试提取每个字符串并制作一个数字列表。 上面的代码目前可以做到这一点,我想看看它是否可以变得更加简洁。

谢谢!

您可以只使用[float(val) for sublist in (row.split() for row in data) for val in sublist]但它更具可读性(并且将来更容易调试)以将它们放在单独的行中

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

嵌套列表理解

嵌套列表理解只不过是另一个list comprehension list comprehension的列表理解,这与nested for loops非常相似。

当我们使用list comprehensions推导从existing list的元素创建一个new list (正方形)时,我们编写:

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

这给出了output

[1, 4, 9]

我们还可以在这个推导中嵌套两个甚至更多for loops

例如:

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

output:

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

相似地:

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)

Output:

[[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]

希望这对您有所帮助!

如果意图只是合并到一个单行中,您可以使用生成器表达式(感谢@OneCricketeer),它只会在需要时生成项目,并使其 memory 比列表有效:

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

一个班轮:

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM