Как добавить числа из файла в список?

#python #list #file

#python #Список #файл

Вопрос:

Я пытаюсь прочитать файл, в котором есть список чисел в каждой строке. Я хочу взять только список чисел, а не соответствующий идентификационный номер, и поместить его в один список для последующей сортировки по частотам в словаре.

Я попытался добавить числа в список, и я могу получить только те числа, которые мне нужны, но я не могу правильно добавить их в список.

У меня есть функция для чтения файла и поиска только того местоположения, которое я хочу прочитать из строки. Затем я пытаюсь добавить его в список, но он продолжает появляться как:

 ['23,43,56,', '67,87,34',]
  

И я хочу, чтобы это выглядело так:

 [23, 43, 56, 67, 87, 34]
  

Вот мой код

 def frequency():
f = open('Loto4.txt', "r")
list = []

    for line in f:
        line.strip('n')
        start = line.find("[")
        end = line.find("]")
        line = line[start 1:end-1]
        list.append(line)
        print(line)

   print(list)
frequency()
  

Это файл, который я читаю:

1:[36,37,38,9]

2:[3,5,28,25]

3:[10,14,15,9]

4:[23,9,31,41]

5:[5,2,21,9]

Комментарии:

1. Лучше заменить line = line[start 1:end-1] на line = line[start 1:end] , потому что конечный индекс фрагмента является эксклюзивным.

Ответ №1:

Попробуйте использовать понимание списка в строке с append (я изменил его на extend ), также, пожалуйста, не называйте переменные, встроенные в python по умолчанию, поскольку list это один, я переименовал его l , но, пожалуйста, сделайте это самостоятельно в следующий раз, также см. Комментарий @MichaelButscher:

 def frequency():
    f = open('Loto4.txt', "r")
    l = []

    for line in f:
        line = line.strip('n')
        start = line.find("[")
        end = line.find("]")
        line = line[start   1:end]
        l.extend([int(i) for i in line.split(',')])
        print(line)

    print(l)

frequency()
  

Комментарии:

1. @U9-В этом есть смысл, в следующий раз я обязательно назову свой список по-другому, спасибо. Однако после того, как я его запустил, я получаю список внутри списка: [[32,34,45], [34,56,43]]. Есть ли какой-нибудь способ сделать это только одним списком?

2. @declac Заменить append на extend .

3. @declac Рад помочь, 🙂 я отредактировал свой, теперь он будет работать.

Ответ №2:

В этом случае можно использовать метод literal_eval модуля ast.

 from ast import literal_eval
def frequency()
    result_list = list()
    with open('Loto4.txt') as f:
        for line in f:
            result_list.extend(list(literal_eval(line)))
    print (result_list)
    return result_list
  

Метод literal_eval модуля ast (абстрактное синтаксическое дерево) используется для безопасной оценки узла выражения или строки в кодировке Unicode или Latin-1, содержащей литерал Python или отображение контейнера. Предоставленная строка или узел могут состоять только из следующих литеральных структур Python: строк, чисел, кортежей, списков, dicts, логических значений и None.
Это можно использовать для безопасной оценки строк, содержащих значения Python из ненадежных источников, без необходимости самостоятельного анализа значений. Он не способен вычислять произвольно сложные выражения, например, с использованием операторов или индексации.

Ответ №3:

 def frequency():
    f = open('Loto4.txt', "r")
    retval = []

    for line in f:
        line.strip('n')
        start = line.find("[")
        end = line.find("]")
        line = line[start 1:end-1]
        retval.extend([int(x) for x in line.split(',')])
        print(line)
    print(retval)

frequency()
  

Я изменил имя list to retval — поскольку list это встроенный класс.