Учитывая строку, как случайно перенести 2 из их букв? - PullRequest
0 голосов
/ 18 декабря 2018

Учитывая строку:

s = 'The quick brown fox jumps over the lazy dog'

Как я могу случайно выбрать токен, поменять две буквы с этого токена и вернуть строку с измененным токеном?Например, (*):

The quick brown fxo jumps over the lazy dog

В приведенном выше примере токен fox был выбран случайным образом и два символа были поменяны местами.

Пока я пытался:

def swap_letters(string):
    s = list(string)
    s[0], s[len(s)-1] = s[len(s)-1].upper(), s[0].lower()
    string = ''.join(s)
    return string    


def foo(a_string):
    a_string_lis = a_string.split()
    token = random.choice(a_string_lis)
    return swap_letters(token)

Тем не менее, я получаю более 2 букв транспонированных, и я не знаю, как сохранить порядок жетонов внутри строк.Любая идея, как получить (*) более питоническим способом?

Ответы [ 4 ]

0 голосов
/ 18 декабря 2018
    def swap_letters(string,pos,string1):
        s = list(string)
        s[len(s)-1], s[len(s)-2] = s[len(s)-2], s[len(s)-1].lower()
        string = ''.join(s)
        string1[pos[0]]=string
        s1= ' '.join(string1)
        return s1    
    def foo(a_string):
        a_string_lis = a_string.split()
        print(a_string_lis)
        token = random.choice(a_string_lis)
        pos=[i for i in range(len(a_string_lis)) if a_string_lis[i]==token]
        return swap_letters(token,pos,a_string_lis)
    s='The quick brown fox jumps over the lazy dog'
    print(foo(s))
0 голосов
/ 18 декабря 2018

Как насчет этого:

from random import choice, sample


s = 'The quick brown fox jumps over the lazy dog'

tokenize = s.split()
token = choice([x for x in tokenize if len(x)>2])  # choose a random word from phrase with at least 2 letters
chosen = sample(token, k=2)                        # choose two random letters word
d = dict(zip(chosen, chosen[::-1]))

new_token = ''
for letter in token:
  if letter in d:
    new_token += d[letter]
    del d[letter]
  else:
    new_token += letter

s = ' '.join([word if word != token else new_token for word in tokenize])

, который производит:

print(s)  # -> The quick brown fox jumps over the lyza dog
#                                                  ||
0 голосов
/ 18 декабря 2018

Вы можете просто использовать str.replace метод:

def swap_letters(string):
    s = list(string)
    s[0], s[len(s)-1] = s[len(s)-1], s[0]
    string = ''.join(s)
    return string

def foo(a_string):
    a_string_lis = a_string.split()
    token = random.choice(a_string_lis)
    return a_string.replace(token, swap_letters(token))
0 голосов
/ 18 декабря 2018

Вы можете сделать что-то вроде этого:

import random
random.seed(42)

s = 'The quick brown fox jumps over the lazy dog'


def transpose(text, number=2):

    # select random token
    tokens = text.split()
    token_pos = random.choice(range(len(tokens)))

    # select random positions in token
    positions = random.sample(range(len(tokens[token_pos])), number)

    # swap the positions
    l = list(tokens[token_pos])
    for first, second in zip(positions[::2], positions[1::2]):
        l[first], l[second] = l[second], l[first]

    # replace original tokens with swapped
    tokens[token_pos] = ''.join(l)

    # return text with the swapped token
    return ' '.join(tokens)


result = transpose(s)
print(result)

Вывод

The iuqck brown fox jumps over the lazy dog

ОБНОВЛЕНИЕ

Для строкдлины 1 приведенный выше код завершается ошибкой, что-то вроде этого должно исправить это:

def transpose(text, number=2):

    # select random token
    tokens = text.split()
    positions = list(i for i, e in enumerate(tokens) if len(e) > 1)

    if positions:

        token_pos = random.choice(positions)

        # select random positions in token
        positions = random.sample(range(len(tokens[token_pos])), number)

        # swap the positions
        l = list(tokens[token_pos])
        for first, second in zip(positions[::2], positions[1::2]):
            l[first], l[second] = l[second], l[first]

        # replace original tokens with swapped
        tokens[token_pos] = ''.join(l)

    # return text with the swapped token
    return ' '.join(tokens)
...