Найти - Пользователи
Полная версия: Чтение чисел из строки
Начало » Python для новичков » Чтение чисел из строки
1 2
GoshkaLP
Добрый день! Вот у меня есть строка, допустим
1 1 1 1 1
Можно ли как то читать по одному числу из данной строки, не считываю полностью?
То есть следующее решение не подходит: arr = list(map(int, input().split()))
AD0DE412
GoshkaLP
не считываю полностью?
не полностью считывая что?
если строку то зачем ее не польностью счивывать
ведь это уже перемееная имеющая значения типа str те это объект в памяти итп итд
уточниете не очень понятно что вы под этим имеете в ввиду
FishHook
string_reader = iter('123456')

print(next(string_reader))
print(next(string_reader))
print(next(string_reader))
print(next(string_reader))
print(next(string_reader))
print(next(string_reader))
print(next(string_reader))
AD0DE412
да но … хотя да (там еще есть пробелы но это уже придирки)
GoshkaLP
Имелось в виду, что эти числа подаются на вход, то есть в инпут грубо говоря, поэтому хотелось бы считывать их по одному, как допустим это работает в С++
py.user.next
GoshkaLP
поэтому хотелось бы считывать их по одному, как допустим это работает в С++
Что ты имеешь в виду конкретно? Там дофига способов считывания чисел по одному.
Приведи код.

GoshkaLP
Вот у меня есть строка, допустим
1 1 1 1 1
Можно ли как то читать по одному числу из данной строки, не считываю полностью?
То есть следующее решение не подходит:
  
arr = list(map(int, input().split()))
Если тебе подают числа друг за другом “бесконечно” (хотя там нет бесконечности, но похожее на бесконечность понятие может быть - получение данных с датчиков, которые работают непрерывно сутками), то читать их можно в конечном автомате, который берёт по символу и копит из них числа, а потом при разрыве числа передаёт число на ожидающий число алгоритм.

В питоне ты можешь использовать для этого sys.stdin.
  
>>> import sys
>>> 
>>> s = sys.stdin.read(2)
12345 
>>> s
'12'
>>>

Пример конечного автомата
Конечный автомат считывает символы и выделяет из них только числа (группы цифр), сохраняя их.
  
>>> import sys
>>> 
>>> def f(count):
...     out = []
...     n = 0
...     state = 'wait_digit'
...     accumulator = ''
...     while True:
...         ch = sys.stdin.read(1)
...         if state == 'wait_digit':
...             if ch.isdigit():
...                 accumulator += ch
...                 state = 'wait_nondigit'
...         elif state == 'wait_nondigit':
...             if ch.isdigit():
...                 accumulator += ch
...             else:
...                 number = int(accumulator)
...                 accumulator = ''
...                 out.append(number)
...                 n += 1
...                 state = 'wait_digit'
...         if n >= count:
...             break
...     return out
... 
>>> f(3)
  111  222  333  444  555  666  777  888  x
[111, 222, 333]
>>> 
>>> f(1)
[444]
>>> 
>>> f(1)
[555]
>>> 
>>> f(2)
[666, 777]
>>> 
>>> f(2)
999
[888, 999]
>>>
GoshkaLP
py.user.next

Вот например:
for (size_t i = 0; i < n; ++i) {
cin >> x;
}
(При этом подразумевается что числа подаются друг за другом через пробел)
То есть хочется сразу обрабатывать числа на лету, не сохраняя их в какой-нибудь массив.
py.user.next
GoshkaLP
То есть хочется сразу обрабатывать числа на лету, не сохраняя их в какой-нибудь массив.
Вот этот конечный автомат бери и при обнаружении числа обрабатывай его.

Можно генератор построить. Но это уже частности.
  
>>> import sys
>>> 
>>> def g():
...     state = 'wait_digit'
...     accumulator = ''
...     while True:
...         ch = sys.stdin.read(1)
...         if state == 'wait_digit':
...             if ch.isdigit():
...                 accumulator += ch
...                 state = 'wait_nondigit'
...         elif state == 'wait_nondigit':
...             if ch.isdigit():
...                 accumulator += ch
...             else:
...                 number = int(accumulator)
...                 accumulator = ''
...                 yield number
...                 state = 'wait_digit'
... 
>>> numbers = g()
>>> 
>>> next(numbers)
  111  222  333  444 x 555 666 y 777 z 888 x
111
>>> next(numbers)
222
>>> next(numbers)
333
>>> next(numbers)
444
>>> next(numbers)
555
>>> next(numbers)
666
>>> next(numbers)
777
>>> next(numbers)
888
>>> next(numbers)
999
999
>>>
GoshkaLP
py.user.next
Спасибо!
doza_and
Да похоже автору стримов хочется
см. StringIO
https://docs.python.org/3/library/io.html

Иногда бывает полезно…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB