如何在列表理解中编写以下代码?
with open('some_file.txt', 'r') as f:
lines = f.readlines()
lines = [line.strip('\n') for line in lines]
list_of_lists = [[int(elm) for elm in line.split(' ')] for line in lines]
我的文件看起来像这样:
3 8 6 9 4
4 3 0 8 6
2 8 3 6 9
3 7 9 0 3
这意味着:
grid = '3 8 6 9 4\n4 3 0 8 6\n2 8 3 6 9\n3 7 9 0 3'
这里试一试,首先拆分每一行,你会得到一个数字列表作为字符串,所以可以使用
map
函数将其更改为int
:
with open('file.txt', 'r') as f:
k = [list(map(int,i.split())) for i in f.readlines()]
print(k)
int
不关心换行符,所以你可以跳过剥离那些。
>>> fake_file = '3 8 6 9 4\n4 3 0 8 6\n2 8 3 6 9\n3 7 9 0 3\n'.splitlines()
>>> [[int(x) for x in line.split()] for line in fake_file]
[[3, 8, 6, 9, 4], [4, 3, 0, 8, 6], [2, 8, 3, 6, 9], [3, 7, 9, 0, 3]]
请注意,
pandas
和 numpy
提供了用于读取此类数据的高级功能,例如numpy.loadtxt
或 pandas.read_csv
.
您不需要分别申请
str.strip
和str.split
。相反,将它们组合在一个操作中。列表理解是通过定义一个列表元素,然后在 for
循环上迭代来构造的。
还要注意,没有参数的
str.strip
将处理 \n
以及空格。同样,没有参数的 str.split
将被空格分割。
from io import StringIO
x = StringIO("""3 8 6 9 4
4 3 0 8 6
2 8 3 6 9
3 7 9 0 3""")
# replace x with open('some_file.txt', 'r')
with x as grid:
list_of_lists = [[int(elm) for elm in line.strip().split()] for line in grid]
结果:
print(list_of_lists)
[[3, 8, 6, 9, 4],
[4, 3, 0, 8, 6],
[2, 8, 3, 6, 9],
[3, 7, 9, 0, 3]]
使用内置插件,使用效率稍微高一点
map
:
list_of_lists = [list(map(int, line.strip().split())) for line in grid]
可以使用地图功能
grid = open('some.txt', 'r')
lines = [line.strip('\n') for line in grid]
list_of_lists = []
f = lambda line: [int(elm) for elm in line.split(' ')]
list_of_lists = map(f, lines)
print(list_of_lists)
或者你可以更短地实现它
f = lambda line: map(int, line.split(' '))
list_of_lists = map(f, lines)
print(list_of_lists)