Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1

Преобразовать строку, разделить числа

21.02.2019, 05:35. Показов 4569. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Преобразовать строку - преобразовал, но уверен, что можно улучшить скорость выполнения программы. Важна производительность. Вот примеры строк. Их особенность в том, что начинаются они с пробела, после слова (либо слов) следует два пробела (хотя это даже не пробелы, как я понял), после чего идет ряд чисел, которые склеены друг с другом. Я разбил их по точке. Интересно, какие ещё есть варианты улучшения данного кода.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# *а-б**2.062.374.8989.9%
# *а бl**2.102.254.8088.6%
 
s = '*William  Hill**2.102.254.8088.6%'
s = s.strip().split('*')
 
l = []
l.append(s[0])
 
count_of_point = s[2].count('.')
#print(count_of_point)
 
i = 0
while i < count_of_point:
  point = s[2].find('.')
  x = s[2][:point+3]
  l.append(x)
  s[2] = s[2].replace(x, '')
  i += 1
 
print(l)
 
#['а-б', '2.06', '2.37', '4.89', '89.9%']
#['а  б', '2.10', '2.25', '4.80', '88.6%']
Добавлено через 20 минут
Нюанс. Числа могут быть как меньше, так и больше 10.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.02.2019, 05:35
Ответы с готовыми решениями:

Преобразовать строку S в строку длины N следующим образом
Всем привет, не получается решить задачу на пайтоне, прошу пoмощи. Дано целое число N (&gt; 0) и строка S. Преобразовать строку S в...

Разделить строку из hex на строку из dec
Здравствуйте, задача легкая но я в python не разбираюсь и прошу сделать &quot;с нуля&quot;. У меня есть строка формата &quot;deadbeef&quot; , надо...

Как преобразовать строку числовой матрицы в стринговую строку?
Есть data frame, например такой. 8 11 82 68 8 8393 8403 932 3260 8 111 78 151 111 1401 151 1375 38 1401 97 Надо его строковые...

16
151 / 86 / 35
Регистрация: 05.08.2017
Сообщений: 257
21.02.2019, 09:20
m0nte-cr1st0, ну если подгонять конкретно под эти 2 примера, то можно через регулярные выражения
Python
1
2
3
4
5
6
import re
 
s = ["*а-б**2.062.374.8989.9%", "*а бl**2.102.254.8088.6%", "'*William  Hill**2.102.254.8088.6%'"]
patt = re.compile("\d{1,2}\.\d{1,2}%*|\w+-*\s*\w+")
for i in s:
    print(re.findall(patt, i))
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
21.02.2019, 09:27
m0nte-cr1st0,
1. Кажется, текстовое описание ваших строк не соответствует примерам. Строка '*William Hill**2.102.254.8088.6%' начинается не с пробела, а со звёздочки.
2. Имхо, в вашем случае задача без проблем параллелится. В идеале, хорошо было бы параллельно считать куски файла (я не знаю, как это сделать, но наверняка способ есть), а уж потом отправить их на параллельную обработку - элементарно.
3. И, раз уж зашла речь про чтение, хорошо бы сравнить потери времени на чтение и разбиение. Может статься, что на разбиение - меньше (чтение с диска - операция долгая) и оптимизация в эту сторону не стоит свеч.
1
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.02.2019, 12:09  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
1. Кажется, текстовое описание ваших строк не соответствует примерам. Строка '*William Hill**2.102.254.8088.6%' начинается не с пробела, а со звёздочки.
почему-то этот редактор заменил эти символы на звёздочки. это не пробелы, это \xa0 символы. пробел здесь только один - между словами "William" и "Hill"


Цитата Сообщение от dondublon Посмотреть сообщение
2. Имхо, в вашем случае задача без проблем параллелится. В идеале, хорошо было бы параллельно считать куски файла (я не знаю, как это сделать, но наверняка способ есть), а уж потом отправить их на параллельную обработку - элементарно.
в данный момент данные поступают последовательно, друг за другом, поэтому вряд ли сейчас нужна параллельность. в будущем - посмотрим.

Цитата Сообщение от dondublon Посмотреть сообщение
3. И, раз уж зашла речь про чтение, хорошо бы сравнить потери времени на чтение и разбиение. Может статься, что на разбиение - меньше (чтение с диска - операция долгая) и оптимизация в эту сторону не стоит свеч.
тут нет чтения с диска. есть парсер, который вытаскивает данные и выводит их в неудобном виде. вот их то и нужно преобразовывать сходу.

Добавлено через 4 минуты
Resistanse, да, тут скорее всего через регулярки нужно решать...

Python
1
2
3
4
5
6
7
8
9
10
11
12
# *18bet**2.202.505.7597.2%
# *William Hill**2.202.505.7597.2%
 
import re
 
s = ["*18bet**2.202.505.7597.2%", "*William Hill**2.202.505.7597.2%"]
patt = re.compile("\d{1,2}\.\d{1,2}%*|\w+-*\s*\w+")
for i in s:
    print(re.findall(patt, i))
 
#['18bet\xa0\xa02', '202', '505', '7597']
#['William Hill', '2.20', '2.50', '5.75', '97.2%']
Вот, по вашему коду.
0
151 / 86 / 35
Регистрация: 05.08.2017
Сообщений: 257
21.02.2019, 12:15
m0nte-cr1st0, а что должно быть? Только 18bet в первом случае?
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.02.2019, 12:45  [ТС]
Resistanse, желательно да. хотя это уже не столь принципиально, конечно...

Добавлено через 21 минуту
Resistanse, только сейчас нормально присмотрелся. В первом случае должно быть
['18bet', '2.20', '2.50', '5.75'', '97.2%']
0
151 / 86 / 35
Регистрация: 05.08.2017
Сообщений: 257
21.02.2019, 13:03
m0nte-cr1st0, откуда данные берешь? Там кодировка другая, если выполнять код, который я скинул, то будет нормально отображаться. Попробуй так сделать со входными данными:
Python
1
2
3
input_data = "18bet\xa0\xa0"
input_data = bytes(input_data, "utf-8").decode("utf-8")
print(input_data)
Ну вместо input_data соответственно подставляешь свои данные

Добавлено через 7 минут
Или же в IDE стоит неправильная кодировка, в pycharm её можно настроить в правом нижнем углу
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.02.2019, 13:28  [ТС]
Resistanse, я Atom использую, но там utf-8
Название: Снимок экрана от 2019-02-21 12-27-06.png
Просмотров: 35

Размер: 2.2 Кб
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.02.2019, 13:35  [ТС]
Resistanse, не вариант

Python
1
2
3
4
5
6
input_data = "18bet\xa0\xa02.202.505.7597.2%"
input_data = bytes(input_data, "utf-8").decode("utf-8")
 
print(re.findall(patt, input_data))
 
#['18bet\xa0\xa02', '202', '505', '7597']
0
151 / 86 / 35
Регистрация: 05.08.2017
Сообщений: 257
21.02.2019, 13:58
Лучший ответ Сообщение было отмечено m0nte-cr1st0 как решение

Решение

m0nte-cr1st0, вот так должно сработать
Python
1
2
3
4
5
6
import re
 
s = ["*а-б\xa0\xa0**2.062.374.8989.9%", "*а бl**2.102.254.8088.6%", "'*William  Hill**2.102.254.8088.6%'"]
patt = re.compile("\d{1,2}\.\d{1,2}%*|\w+\s*-*\w+", flags=re.UNICODE)
for i in s:
    print(re.findall(patt, i))
flags=re.UNICODE означает, что "\w" будет искать только юникодные символы
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
21.02.2019, 14:19
Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
в данный момент данные поступают последовательно, друг за другом, поэтому вряд ли сейчас нужна параллельность. в будущем - посмотрим.
Вот смотрите.
Если поступают они медленнее, чем парсятся - значит, bottleneck - это поступление данных и ускорение парсинга погоды не сделает.
Если поступают они быстрее - значит, имеет смысл параллелить. Пока новые данные идут, старые уже парсим. Несколько потоков, быстрое поступление раскидывает строки по потокам.

Добавлено через 9 минут
Да, кстати, вроде этих ихние новомодные asyncio как раз к таким задачам подходят. Но это уже разбираться надо, я туда глубоко не влезал.
1
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.02.2019, 14:24  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Если поступают они быстрее - значит, имеет смысл параллелить. Пока новые данные идут, старые уже парсим. Несколько потоков, быстрое поступление раскидывает строки по потокам.
да, тут без асинхронки и потоков никуда в этом проекте.. нужно будет в эту сторону копать.
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.02.2019, 14:47  [ТС]
Resistanse, да, это всё то... за исключением того, что на входе должны быть не кодировки символов, а сами символы... не знаю как объяснить..
вот, смотрите скрины. вверху - код с вашими входными данными, внизу - с моими.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.02.2019, 17:51
Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
Интересно, какие ещё есть варианты улучшения данного кода
1) Использовать strip, чтобы удалять все лидирующие и конечные пробельные символы. (Это у вас уже есть, поэтому переходим к др. пунктам)
2) Использовать squeeze, чтобы replace all sequences of whitespace chars with a single space.
3) Использовать правильный XPATH. Судя по всему вы неправильно парсите раз у все склеивается.

Добавлено через 5 минут
Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
тут без асинхронки и потоков никуда в этом проекте
Если на сайте есть robots.txt, то там есть лимиты запросов для ботов. И когда вы эти лимиты превысите - через определенное время вас тупо забанят. А стандартный лимит - это не больше 1-3 запросов в секунду.
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.02.2019, 17:56  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
1) Использовать strip, чтобы удалять все лидирующие и конечные пробельные символы.
да, стрип применю ,чтобы убрать пробельный символ вначале.

Цитата Сообщение от Garry Galler Посмотреть сообщение
2) Использовать squeeze, чтобы replace all sequences of whitespace chars with a single space.
впервые слышу о таком. можете пример привести?

Цитата Сообщение от Garry Galler Посмотреть сообщение
3) Использовать правильный XPATH. Судя по всему вы неправильно парсите раз у все склеивается.
спасибо, подумаю над этим. я сейчас вывожу всю строку из таблицы. видимо нужно её по ячейкам выводить...

Добавлено через 51 секунду
Цитата Сообщение от Garry Galler Посмотреть сообщение
Если на сайте есть robots.txt, то там есть лимиты запросов для ботов. И когда вы эти лимиты превысите - через определенное время вас тупо забанят. А стандартный лимит - это не больше 1-3 запросов в секунду.
что предлагаете в таком случае?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.02.2019, 20:24
Лучший ответ Сообщение было отмечено m0nte-cr1st0 как решение

Решение

squeeze это функция сжатия множественных пробельных символов (не только пробелов) в строке до одного. Позволяет нормализовать строку.
Используется в web фреймворках. Например в Tornado: tornado.escape.squeeze(value)
Реализация:
Python
1
2
3
def squeeze(value):
    """Replace all sequences of whitespace chars with a single space."""
    return re.sub(r"[\x00-\x20]+", " ", value).strip()
В конце к строке применяется strip, удаляя также лидирующие и конечные пробельные символы.
Python
1
2
3
>>> squeeze(' 1   3\n\r 4 ')
'1 3 4'
>>>
Насчет robots.txt. Просто запросите его у сайта и посмотрите настройки директивы Crawl-delay.
К примеру Crawl-delay: 0.5 разрешает запрашивать страницы сайта не чаще чем через каждые полсекунды.
Исходя из указанного лимита нужно будет подстраивать скорость запросов (причем вряд ли в сторону увеличения, чаще наоборот). Редкий сайт позволяет себя DDOS-ить запросами безнаказанно. Но если явных ограничений нет - тогда нужно смотреть опытным путем.
Сделать тест на 10-20 запросов в секунду и посмотреть как долго сайт будет нормально отвечать без 500-x ошибок и разрывов коннекта. Исходя из этого уже думать стоит ли вообще пробовать параллелить запросы. Но что касается самой обработки данных (уже после запроса), то если она действительно bottleneck для приложения, имеет смысл использовать многопоточную или асинхронную очередь.

Ну а таблицу, конечно же, нужно изначально разбирать по ячейкам.
1
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
21.02.2019, 21:08  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Насчет robots.txt. Просто запросите его у сайта и посмотрите настройки директивы Crawl-delay.
К примеру Crawl-delay: 0.5 разрешает запрашивать страницы сайта не чаще чем через каждые полсекунды.
Исходя из указанного лимита нужно будет подстраивать скорость запросов (причем вряд ли в сторону увеличения, чаще наоборот). Редкий сайт позволяет себя DDOS-ить запросами безнаказанно. Но если явных ограничений нет - тогда нужно смотреть опытным путем.
Сделать тест на 10-20 запросов в секунду и посмотреть как долго сайт будет нормально отвечать без 500-x ошибок и разрывов коннекта. Исходя из этого уже думать стоит ли вообще пробовать параллелить запросы. Но что касается самой обработки данных (уже после запроса), то если она действительно bottleneck для приложения, имеет смысл использовать многопоточную или асинхронную очередь.
Спасибо. Как-то сложно на первый взгляд смотрится...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.02.2019, 21:08
Помогаю со студенческими работами здесь

Преобразовать строку s в строку длины n следующим образом
Дано целое число n и строка s. Преобразовать строку s в строку длины n следующим образом: если длина строки s больше n, то отбросить...

Как разделить и преобразовать строку из string в int?
Требуется создать приложение для нахождения максимального числа из строки. Поиск по форумам дал кое какие результаты, но не могу понять...

Преобразовать строку из файла, содержащую запись десятичного числа, в строку с двоичным числом
Дана строка, изображающая десятичную запись целого положительного числа. Вывести строку, изображающую двоичную запись этого же числа. И...

Преобразовать строку, удалив пробелы, и разделить слова одиночной "звёздочкой"
Дана строка слов, разделенных пробелами. Между словами может быть несколько пробелов, в начале и конце строки также могут быть пробелы....

Разделить строку данных на отдельные числа
Народ, подскажите, пожалуйста, как мне реализовать заполнение данных из txt фаила в SrtingGrid. Фаил заполнен так: 2 3 4 5 6 7 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru