Добавляйте отдельные слова к набору таким образом, чтобы я получал уникальные буквы

#python

#python

Вопрос:

Я хочу иметь возможность добавлять слова в набор таким образом, чтобы уникальные значения учитывались внутри каждого слова, а не для всей строки слов.

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

Большое спасибо

 def splt(t):
    newset = set()
    
    t.split()
    for word in t:
        newset.update(word)
    
    return(newset)

t = 'say hi to your mom'
splt(t)
 

Комментарии:

1. Кажется, вам нужен один набор для каждого слова, а не один набор для всей строки? Каков ожидаемый результат в этом примере?

2. Да, это хороший момент… как бы я тогда получил отдельные наборы?

3. Создавайте их внутри цикла, а не снаружи.

4. Ах, я попробую это сейчас! Спасибо!

5. Я в восторге. Большое спасибо! Это полезно знать в целом.

Ответ №1:

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

 test = "this is a test"
chars = []

for each in test:
    if each not in chars:
        chars.append(each)

print(chars)
## output: ['t', 'h', 'i', 's', ' ', 'a', 'e']
 

Пожалуйста, дайте мне знать, если у вас возникнут какие-либо вопросы или проблемы!

Редактировать:

В соответствии с операцией я переписал код для предполагаемого вывода

Пример:

 test = "this is a test"
words = []


for each in test.split():
    new_string = []
    for char in each:
        if char not in new_string:
            new_string.append(char)
    words.append("".join(new_string))

print(" ".join(words))
## output: this is a tes
 

Я просто использую " ".join(words) для отображения выходных данных в виде строки с пробелами. Список слов будет в том порядке, в котором вы передаете предложение.

Еще раз дайте мне знать, если у вас возникнут проблемы или дополнительные вопросы!

Править Править:

У Op возникли проблемы с инкапсуляцией в функцию:

 test = "this is a test"  

def rep_letters(s):
    words = []
    for each in s.split():
        new_string = []         
        for char in each:             
            if char not in new_string:                 
                new_string.append(char)         
        words.append("".join(new_string))
    return(" ".join(words))

print(rep_letters(test))
 

Комментарии:

1. Да, я действительно знаком с этим; тогда я бы просто преобразовал его обратно в строку с помощью str (символов)… Конечная функция должна была бы просто вывести строку.

2. @James Итак, это фактический результат, который вы хотите получить: «Это tes». Извините, у меня возникли проблемы с пониманием того, каким именно вы хотите видеть результат.

3. @James Моя правка должна привести вас туда, где вам нужно быть.

4. Быстрый вопрос: когда я помещаю его в функцию, я, кажется, получаю только «tes», но не «this is a». test = "this is a test" def rep_letters(s): words = [] for each in s.split(): new_string = [] for char in each: if char not in new_string: new_string.append(char) words.append("".join(new_string)) return(" ".join(new_string)) rep_letters(test)

5. @James Это потому, что вы используете return(" ".join(new_string)) which будет только последним словом. Все слова находятся в списке слов, поэтому вам нужно будет выполнить return(" ".join(words)) РЕДАКТИРОВАНИЕ: проверьте второе редактирование моего ответа.

Ответ №2:

Используйте понимание списка с условием. Чтобы удалить слова, содержащие повторяющиеся символы, просто проверьте соответствие длины уникальных символов длине самого слова.

 [word if len(set(word)) == len(word) else ''.join(set(word)) for word in t.split()]
 

Выходной сигнал

 ['say', 'hi', 'to', 'your', 'mo']