Управление дубликатами при сортировке по порядку символов в строке - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь решить задачу, в которой мне нужно изменить порядок букв в строке s в том порядке, в котором они появляются в строке t. Например:

For s = "weather" and t = "therapyw", the output should be
sortByString(s, t) = "theeraw";

For s = "good" and t = "odg", the output should be
sortByString(s, t) = "oodg".

Это мой код:

def sortByString(s, t):

    s_list = list(s)
    t_list = list(t)
    output = []

    for i in range(len(t_list)):
        if t_list[i] in s_list:
            output.insert(i, t_list[i])

    return ''.join(output)          

Он работает для всех случаев, кроме случаев, когда одна и та же буква существует более одного раза.

s: "weather"
t: "therapyw"
Output:
"theraw"
Expected Output:
"theeraw"

Как я могу справиться с этой ситуацией в моем приведенном выше коде? Что мне не хватает? Я ценю любую помощь, но вместо того, чтобы просто выпалить ответ, я хотел бы знать, что я делаю неправильно.

Ответы [ 3 ]

1 голос
/ 17 июня 2020

Проблема с вашим текущим кодом заключается в том, что он добавляет только одну копию каждого символа из t в output, независимо от того, сколько раз он встречается в s. Вы можете обойти это, перебирая count этого символа в s и добавляя к output для каждого счетчика:

def sortByString(s, t):

    s_list = list(s)
    t_list = list(t)
    output = []

    for i in range(len(t_list)):
        for _ in range(s_list.count(t_list[i])):
            output.append(t_list[i])

    return ''.join(output)

print(sortByString('weather',"therapyw"))
print(sortByString('good',"odg"))

Вывод:

theeraw
oodg

Вы можно упростить l oop, просто добавив копии списка с текущим символом в соответствии с количеством символов в s:

for c in t_list:
    output = output + [c] * s_list.count(c)
0 голосов
/ 17 июня 2020

2 шага:

a. создать отсортированный список символов в s и их порядок в t с помощью index ()

b. используйте zip (* для извлечения отсортированного списка символов

s = "weather"
t = "therapy"

a = sorted([(t.index(c),c) for c in s])
b = ''.join(list(zip(*a))[1])

print(b) 

Вывод:

theeraw
0 голосов
/ 17 июня 2020

Простой способ

Используйте enumerate и превратите вашу строку в dict

def sortByString(s, t):

    s_list = list(s)
    t_list = list(t)

    orderdict = {char: index for index, char in enumerate(t_list)}
    output = sorted(list('weather'),key=orderdict.get)

    return ''.join(output)          

Это позволит повторять значения

  • Пример
>>> sortByString('weather',"therapyw")
'theeraw'

Изменение кода OP

Просто добавьте количество элементов, которое он встречается в s, в output

def sortByString(s,t):
     s_list = list(s)
     t_list = list(t)
     output = []
     for i in range(len(t_list)):
             if t_list[i] in s_list:
                     output.append(t_list[i]*s_list.count(t_list[i]))
     return ''.join(output)
  • вывод
>>> sortByString('weather',"therapyw")
'theeraw'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...