Python-从文本文件读取并放入列表
作为标题,我一直在尝试从文件中读取文本,转换为int并将其存储在列表中。我的文本文件如下所示:Python-从文本文件读取并放入列表,python,Python,作为标题,我一直在尝试从文件中读取文本,转换为int并将其存储在列表中。我的文本文件如下所示: 1,2 3,4 5,6 [[1, 2], [3, 4], [5, 6]] 我想读这个文件,把每一对数字放到一个列表m中,然后把这些列表存储在一个更大的列表lis中。以下是我的尝试: def read_file(): lis = [] m = [0,0] with open("data.txt") as f: for line in f:
1,2
3,4
5,6
[[1, 2], [3, 4], [5, 6]]
我想读这个文件,把每一对数字放到一个列表m中,然后把这些列表存储在一个更大的列表lis中。以下是我的尝试:
def read_file():
lis = []
m = [0,0]
with open("data.txt") as f:
for line in f:
m[0], m[1] = line.split(",") # assign to list m
m[0] = int(m[0]) # cut off '\n' and for later use
m[1] = int(m[1])
lis.append(m) # store in lis
print lis
我希望lis是这样的:
1,2
3,4
5,6
[[1, 2], [3, 4], [5, 6]]
但事实是:
[[5, 6], [5, 6], [5, 6]]
我尝试了插入而不是附加,但似乎这不是它有问题的地方。我需要一些帮助-提前谢谢你 在循环的每次迭代中都重用相同的列表m,每次都覆盖上一次迭代中设置的值。最后,lis保存了许多对同一列表的引用
def read_file():
lis = []
with open("data.txt") as f:
for line in f:
m, n = line.split(",")
lis.append([int(m), int(n)])
print lis
相反,在循环中将新值作为一个整体分配给m:
for line in f:
m = [0,0]
m[0], m[1] = line.split(",")
m[0] = int(m[0])
m[1] = int(m[1])
lis.append(m)
或更短:
for line in f:
m = line.split(",")
m[0] = int(m[0])
m[1] = int(m[1])
lis.append(m)
甚至更短,使用地图:
for line in f:
m = list(map(int, line.split(",")))
lis.append(m)
或者更简短,使用列表理解:
lis = [list(map(int, line.split(","))) for line in f]
在循环的每次迭代中都重用相同的列表m,每次都覆盖上一次迭代中设置的值。最后,lis保存了许多对同一列表的引用 相反,在循环中将新值作为一个整体分配给m:
for line in f:
m = [0,0]
m[0], m[1] = line.split(",")
m[0] = int(m[0])
m[1] = int(m[1])
lis.append(m)
或更短:
for line in f:
m = line.split(",")
m[0] = int(m[0])
m[1] = int(m[1])
lis.append(m)
甚至更短,使用地图:
for line in f:
m = list(map(int, line.split(",")))
lis.append(m)
或者更简短,使用列表理解:
lis = [list(map(int, line.split(","))) for line in f]
改为使用csv.reader对象,该对象使用逗号作为默认字段分隔符:
import csv
with open('data.txt') as f:
reader = csv.reader(f)
result = [list(map(int, lst)) for lst in reader]
print(result)
输出:
[[1, 2], [3, 4], [5, 6]]
改为使用csv.reader对象,该对象使用逗号作为默认字段分隔符:
import csv
with open('data.txt') as f:
reader = csv.reader(f)
result = [list(map(int, lst)) for lst in reader]
print(result)
输出:
[[1, 2], [3, 4], [5, 6]]
在lis中,所有索引引用一个列表m。如果m is中发生任何更新,则m在任何地方都会更新
试试这个
lis.append( list(map(int,line.split(","))))
输出
[1'、[2']、[3'、[4']、[5'、[6']
在lis中,所有索引引用一个列表m。如果m is中发生任何更新,则m在任何地方都会更新
试试这个
lis.append( list(map(int,line.split(","))))
输出
[1'、[2']、[3'、[4']、[5'、[6']
您正在重用和覆盖同一个实例中的值m.m=[0,0]是您创建子列表的唯一时间,因此您使用的是同一个实例中的值m.m=[0,0]是您创建子列表的唯一时间,因此您使用的是同一个,而使用csv.reader肯定更好,这听起来似乎本身就能解决问题,但事实并非如此。问题在于重用m,在没有任何解释的情况下,OP可以使用csv.reader再次使用m。虽然使用csv.reader肯定更好,但这听起来似乎本身就能解决问题,但事实并非如此。问题在于重用m,在没有任何解释的情况下,OP可以使用csv.reader.Nice插图再次使用m,但我认为appendm+[]不是解决问题的最佳方法。IMHO,最好不要再使用m。很好的说明,但我不认为appendm+[]是解决这个问题的最佳方法。我的意思是,最好不要再使用m了。很遗憾,在我看来,最好的代码没有文本来解释。。。我甚至建议不要将列数限制为2,而是使用类似lis.append[inti.strip for I in line.split',']的列表理解。遗憾的是,我认为最好的代码没有文本可供解释。。。我甚至建议不要将列数限制为2,而是使用类似lis.append[inti.strip for I in line.split',']的列表理解。谢谢!地图在这种情况下真的很聪明。谢谢!在这种情况下,Map真的很聪明。