Есть ли питонный способ вставки пробелов в случайных позициях существующей строки? - PullRequest
2 голосов
/ 28 ноября 2010

есть ли питонный способ реализовать это:

Вставка / пробелы_1 / U + 0020 ПРОБЕЛ символы в / key_1 / в случайном порядке позиции, отличные от начала или конца строки.

Там / space_1 / - это целое число, а / key_1 / - произвольная существующая строка.

Спасибо.

Ответы [ 7 ]

2 голосов
/ 28 ноября 2010

строк в Python являются неизменяемыми, поэтому вы не можете изменить их на месте. Тем не менее:

import random

def insert_space(s):
    r = random.randint(1, len(s)-1)
    return s[:r] + ' ' + s[r:]

def insert_spaces(s):
    for i in xrange(random.randrange(len(s))):
        s = insert_space(s)
    return s
1 голос
/ 28 ноября 2010

Только потому, что никто еще не использовал map:

import random
''.join(map(lambda x:x+' '*random.randint(0,1), s)).strip()
1 голос
/ 28 ноября 2010

Вот решение на основе списка:

import random

def insert_spaces(s):
    s = list(s)
    for i in xrange(len(s)-1):
        while random.randrange(2):
            s[i] = s[i] + ' '
    return ''.join(s)
1 голос
/ 28 ноября 2010

Я произвольно решу, что вы никогда не хотите, чтобы два пробела вставлялись смежно - каждая точка вставки использовалась только один раз - и эта «вставка» исключает «добавление» и «добавление».

Сначала создайте список точек вставки ...

insert_points = range (1, len (mystring))

Выберите случайный выбор из этого списка и отсортируйте его ...

import random
selected = random.sample (insert_points, 5)
selected.sort ()

Составьте список фрагментов вашей строки ...

selected.append (len (mystring))  #  include the last slice
temp = 0  #  start with first slice
result = []
for i in selected :
  result.append (mystring [temp:i])
  temp = i

Теперь построили новую строку ...

" ".join (result)
0 голосов
/ 29 ноября 2010

Мы случайным образом выберем места, в которые будут добавлены пробелы - после символа 0, 1, ... n-2 строки (n-1 - последний символ, и после него мы не будем ставить пробел); и затем вставьте пробелы, заменив символы в указанных местах на (исходный символ) + ''. Это похоже на решение Steve314 (то есть, сохраняя предположение, что вам не нужны последовательные пробелы - что ограничивает общее количество пробелов, которые вы можете иметь), но без использования списков.

Таким образом:

import random
def insert_random_spaces(original, amount):
    assert amount > 0 and amount < len(original)
    insert_positions = sorted(random.sample(xrange(len(original) - 1), amount))
    return ''.join(
        x + (' ' if i in insert_positions else '')
        for (i, x) in enumerate(original)
    )
0 голосов
/ 28 ноября 2010

Вот, пожалуйста ...

def thePythonWay(s,n):
    n = max(0,min(n,25))
    where = random.sample(xrange(1,len(s)),n)
    return ''.join("%2s" if i in where else "%s" for i in xrange(len(s))) % tuple(s)
0 голосов
/ 28 ноября 2010

Если вы хотите добавить более одного пробела, тогда идите

s[:r] + ' '*n + s[r:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...