#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
это встроенный класс.