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