повторите число N раз в строке во входном файле python ::

#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]

Надеюсь, комментарии помогут вам понять логику, которая относительно проста