Преобразование списка внутри списка из строки в целые числа
После приблизительно восьми часов поиска и попыток реализовать решения, я все еще раздосадован этой проблемой.
Я пытаюсь сделать пакет dinky 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 ответа:
Вы можете использовать
map
для преобразования строк в ints.(Кажется, у вас есть дополнительная итерация, чтобы найти количество участников, которые могут быть подсчитаны во время первого цикла)
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
.
Вместо этого:
c1resplist.append(line)
Используйте вместо этого:
c1resplist.append([int(x) for x in line])
Этопонимание списка перебирает каждый элемент в списке
line
и изменяет его наint
. Затем новый список добавляется к существующему спискуc1resplist
.
Существует множество способов улучшить ваш текущий код (например, вы открываете и повторяете файл дважды), но это должно, по крайней мере, дать вам данные, которые вы ищете.