Преобразование списка внутри списка из строки в целые числа


После приблизительно восьми часов поиска и попыток реализовать решения, я все еще раздосадован этой проблемой.

Я пытаюсь сделать пакет 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 2

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.


Существует множество способов улучшить ваш текущий код (например, вы открываете и повторяете файл дважды), но это должно, по крайней мере, дать вам данные, которые вы ищете.