将列表中的列表从字符串转换为整数

时间:2015-04-26 20:56:10

标签: python type-conversion python-3.4

经过大约八个小时的搜索并尝试实施解决方案后,我仍然对这个问题感到烦恼。

我正在尝试制作一个可以从文本文件中读取数据的极小ANOVA包,根据所述文件中的行计算参与者数量,然后在几次简单计算后运行ANOVA。

但是,让我完成这个项目的一件事就是将所有内容转换为可计算的格式 - 从字符串值到整数值。

这是我到目前为止所拥有的:

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

我非常感谢任何指导。感谢。

2 个答案:

答案 0 :(得分:1)

而不是:

c1resplist.append(line)

改为使用:

c1resplist.append([int(x) for x in line])

list comprehension会对line列表中的每个项进行迭代,并将其更改为int。然后,新列表会附加到您现有的c1resplist列表中。

有很多方法可以改进您当前的代码(例如,您打开并迭代文件两次),但这至少应该为您提供您正在寻找的数据。

答案 1 :(得分:1)

您可以使用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会返回map objects