将列表中的列表从字符串转换为整数
Converting a List within a List from String to Integers
经过大约八个小时的搜索和尝试实施解决方案,我仍然为这个问题烦恼。
我正在尝试制作一个极小的方差分析包,它可以从文本文件中读取数据,根据所述文件中的行计算参与者的数量,然后 运行 经过一些简单的计算后方差分析。
但是,阻止我完成这个项目的一件事是将所有内容都转换为可计算的格式——从字符串值到整数值。
这是我目前的情况:
def cond1():
cond1file=open("condition1.txt","r")
c1resplist=[]
line=cond1file.readline()
while line !='':
line=line.split()
c1resplist.append(line)
line=(cond1file.readline())
cond1file.close()
participants=0
with open("condition1.txt","r") as f:
for line in f:
participants+=1
这是它正在读取的数据文件中的文本:
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
这是 readline 部分生成的输出:
[['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3']]
非常感谢任何和所有指导。谢谢
而不是这个:
c1resplist.append(line)
改用这个:
c1resplist.append([int(x) for x in line])
此 list comprehension 遍历 line
列表中的每个项目,并将其更改为 int
。然后,新列表将附加到您现有的 c1resplist
列表。
有很多方法可以改进您当前的代码(例如,您打开并遍历文件两次),但这至少应该能为您提供所需的数据。
您可以使用 map
将字符串转换为整数。
(你似乎有一个额外的迭代来找到在第一个循环中可以计算的参与者数量)
def cond1_a():
c1resplist=[]
participants=0
with open("condition1.txt","r") as f:
for line in f:
c1resplist.append(list(map(int, line.split())))
participants+=1
return c1resplist, participants
print(cond1_a())
# ([[1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3]], 10)
您还可以使用列表理解:
def cond1_b():
with open("condition1.txt","r") as f:
c1resplist = [list(map(int, line.split())) for line in f]
return c1resplist, len(c1resplist)
print(cond1_b())
# ([[1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3]], 10)
或者不使用地图,而是使用嵌套列表理解:
def cond1_c():
with open("condition1.txt","r") as f:
c1resplist = [[int(x) for x in line.split()] for line in f]
return c1resplist, len(c1resplist)
print cond1_c()
# ([[1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3]], 10)
编辑:
正如@Padraic Cunningham 提到的,python 3 需要使用 list(map(fn, it))
因为 map
returns map objects
.
经过大约八个小时的搜索和尝试实施解决方案,我仍然为这个问题烦恼。
我正在尝试制作一个极小的方差分析包,它可以从文本文件中读取数据,根据所述文件中的行计算参与者的数量,然后 运行 经过一些简单的计算后方差分析。
但是,阻止我完成这个项目的一件事是将所有内容都转换为可计算的格式——从字符串值到整数值。
这是我目前的情况:
def cond1():
cond1file=open("condition1.txt","r")
c1resplist=[]
line=cond1file.readline()
while line !='':
line=line.split()
c1resplist.append(line)
line=(cond1file.readline())
cond1file.close()
participants=0
with open("condition1.txt","r") as f:
for line in f:
participants+=1
这是它正在读取的数据文件中的文本:
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
1 2 3 1 2 3
这是 readline 部分生成的输出:
[['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3'], ['1', '2', '3', '1', '2', '3']]
非常感谢任何和所有指导。谢谢
而不是这个:
c1resplist.append(line)
改用这个:
c1resplist.append([int(x) for x in line])
此 list comprehension 遍历 line
列表中的每个项目,并将其更改为 int
。然后,新列表将附加到您现有的 c1resplist
列表。
有很多方法可以改进您当前的代码(例如,您打开并遍历文件两次),但这至少应该能为您提供所需的数据。
您可以使用 map
将字符串转换为整数。
(你似乎有一个额外的迭代来找到在第一个循环中可以计算的参与者数量)
def cond1_a():
c1resplist=[]
participants=0
with open("condition1.txt","r") as f:
for line in f:
c1resplist.append(list(map(int, line.split())))
participants+=1
return c1resplist, participants
print(cond1_a())
# ([[1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3]], 10)
您还可以使用列表理解:
def cond1_b():
with open("condition1.txt","r") as f:
c1resplist = [list(map(int, line.split())) for line in f]
return c1resplist, len(c1resplist)
print(cond1_b())
# ([[1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3]], 10)
或者不使用地图,而是使用嵌套列表理解:
def cond1_c():
with open("condition1.txt","r") as f:
c1resplist = [[int(x) for x in line.split()] for line in f]
return c1resplist, len(c1resplist)
print cond1_c()
# ([[1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3]], 10)
编辑:
正如@Padraic Cunningham 提到的,python 3 需要使用 list(map(fn, it))
因为 map
returns map objects
.