Форум сайта python.su
Добрый день! Вот у меня есть строка, допустим
1 1 1 1 1
Можно ли как то читать по одному числу из данной строки, не считываю полностью?
То есть следующее решение не подходит: arr = list(map(int, input().split()))
Офлайн
GoshkaLPне полностью считывая что?
не считываю полностью?
Отредактировано AD0DE412 (Июль 29, 2020 18:40:08)
Офлайн
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 (Июль 29, 2020 18:50:31)
Офлайн
Имелось в виду, что эти числа подаются на вход, то есть в инпут грубо говоря, поэтому хотелось бы считывать их по одному, как допустим это работает в С++
Офлайн
GoshkaLPЧто ты имеешь в виду конкретно? Там дофига способов считывания чисел по одному.
поэтому хотелось бы считывать их по одному, как допустим это работает в С++
GoshkaLPЕсли тебе подают числа друг за другом “бесконечно” (хотя там нет бесконечности, но похожее на бесконечность понятие может быть - получение данных с датчиков, которые работают непрерывно сутками), то читать их можно в конечном автомате, который берёт по символу и копит из них числа, а потом при разрыве числа передаёт число на ожидающий число алгоритм.
Вот у меня есть строка, допустим
1 1 1 1 1
Можно ли как то читать по одному числу из данной строки, не считываю полностью?
То есть следующее решение не подходит:arr = list(map(int, input().split()))
>>> 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] >>>
Отредактировано py.user.next (Июль 30, 2020 02:19:51)
Офлайн
py.user.next
for (size_t i = 0; i < n; ++i) {
cin >> x;
}
Отредактировано GoshkaLP (Июль 30, 2020 02:24:55)
Офлайн
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 >>>
Офлайн
py.user.nextСпасибо!
Офлайн
Да похоже автору стримов хочется
см. StringIO
https://docs.python.org/3/library/io.html
Иногда бывает полезно…
Офлайн