#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']