#python #string #numpy
Вопрос:
Я пытаюсь повторить число во входном файле.в N раз я читал, что мог бы сделать N* строку, однако, поскольку мой ввод не является строкой, а это число в строке, я преобразую его в numpy, поэтому все, что мне нужно, — это способ повторить ввод с самого начала
Мой код, как показано ниже:
import numpy as np with open('trial.dat', 'r') as f: data = f.readlines() data = [(d ' ')[:d.find('#')].rstrip() for d in data] x=data[0] y=np.fromstring(x,dtype=int, sep=',') # should be y=[1 2 3 3 3 3 3]
#ошибка вывода : Предупреждение об устаревании: строка или файл не могут быть прочитаны до конца из-за несоответствия данных; в будущем это приведет к ошибке значения. y=np.из строки(x,dtype=int, sep=’,’) Также спрашиваю, есть ли способ добавить [] в определение входного файла ???
Файл .dat выглядит следующим образом:
1,2,3*5 # Can I add like [1,2,3*5] or I am also open to any other way to repeat number
Комментарии:
1. Каков ожидаемый результат? В чем заключается ошибка?
2. @BeChillerToo Спасибо за ваши отзывы, ниже приведены ожидаемые результаты и ожидаемая ошибка: y=[1 2 3 3 3 3 3] ошибка: Предупреждение об устаревании: строка или файл не могут быть прочитаны до конца из-за несоответствия данных; в будущем это вызовет ошибку ValueError. y=np.из строки(x,dtype=int, sep=’,’)
3. Это
*
не часть целого числа и не данный разделитель (который есть,
), поэтому NumPy застревает в этой точке, так как он не знает, как разобрать этот символ.4. Трюк «N* строка» работает в Python, а не во входном файле. Поэтому добавление такой вещи во входной файл, независимо от того, касается ли это строк или целых чисел, никогда не сработает.
5. @9769953 Я согласен с вами, но не могли бы вы рассказать/предложить мне возможное решение для повторения числа во входном файле ??
Ответ №1:
Как упоминали выше комментаторы, вам не нужно numpy
этого делать.
Считывание данных
Всего для одной строки вы могли бы сделать что-то вроде этого:
# read line from data file and make line into list delimiting by ',' with open('trial.dat', 'r') as f: data = f.readline().rstrip().split(',') newlist = [] # step trough items in list data for d in data: if "*" in d: # if there's a "*" in the list [a,b] = d.split('*') # split it on that value (e.g. d = "a*b" --gt; ["a", "b"] for i in range(int(a)): # append "b" a times newlist.append(b) else: # if there's no "*" in list just append normally newlist.append(d) print(newlist) # ['1', '2', '5', '5', '5']
Если у вас в файле несколько строк, я бы добавил к вышесказанному что-то вроде этого (я только что написал вашу строку trial.dat
3 раза для демонстрации).:
#if you have multiple lines with open('trial_multi.dat', 'r') as f: data = [line.rstrip().split(',') for line in f.readlines()] newlist = [] # step trough items in list data for line in data: for d in line: if "*" in d: # if there's a "*" in the list [a,b] = d.split('*') # split it on that value (e.g. d = "a*b" --gt; ["a", "b"] for i in range(int(a)): # append "b" a times newlist.append(b) else: # if there's no "*" in list just append normally newlist.append(d) print(newlist) # ['1', '2', '5', '5', '5', '1', '2', '5', '5', '5', '1', '2', '5', '5', '5']
Изменение типа
Если вам нужны массивы, вы можете просто сделать что-то вроде newlist = np.array(newlist)
. Если вы хотите, чтобы значения были float
или int
типа, вы можете изменить тип с помощью чего-то вроде newlist = [int(i) for i in newlist]
. Или вы можете объединить их, чтобы создать массив int
значений с чем-то вроде newlist = np.array(newlist, dtype = 'int')
. Конечно, если вы хотите float
или какой-то другой тип вместо int
того, чтобы просто изменить это в приведенном выше.
Ответ №2:
data = "1,2,3*5" elements = data.split(",") numbers = [] for elt in elements: if "*" in elt: n, mult = elt.split("*") numbers = numbers [int(n)] * int(mult) else: numbers.append(int(elt)) print(numbers) # [1, 2, 3, 3, 3, 3, 3]
Комментарии:
1. Большое вам спасибо за вашу помощь, за работу! также другой комментарий Аюша Панды!
2. Пожалуйста, добавьте некоторые пояснения к вашим ответам, чтобы объяснить, что вы изменили по сравнению с исходным кодом и почему. Предоставление пользователю чего-либо для копирования и вставки без контекста не даст ему опыта обучения и сделает ответ менее полезным для будущих посетителей.
Ответ №3:
with open('trial.dat', 'r') as f: data = f.readlines() data = data[0].split(',') # Split input by commas output = '' for i in range(len(data)): # Iterating through each group that was split by commas str_split = data[i].split('*') # Splitting the split string by "*" if len(str_split) == 2: # Checking if "*" was present in the split string output = str_split[0] * int(str_split[1]) # If "*" is present, add multiplied string to output else: output = str(data[i]) output = list(map(int, list(output))) # Convert list to array, the convert array elements to int print(output)
Это должно его сократить. Вместо использования векторов я использовал операции с массивами. Вопрос был немного запутанным относительно желаемого результата, поэтому это решение возвращает массив целых чисел.
Например: 1,2,3*5
вернулся бы [1, 2, 3, 3, 3, 3, 3]
Надеюсь, комментарии помогут вам понять логику, которая относительно проста