-5

Как найти слово, в котором число различных символов минимально? Если таких слов несколько, найти первое из них.

Как это можно сделать?

Neon
  • 153
  • 2
  • 10
  • Я думаю в качестве ответа подойдут слова а, и, б, о, у, я, ее, с, к, в, ну и т.п. – Darth Jan 08 '16 at 21:12
  • уточните что вы понимаете под символом? (байт, Unicode codepoint, символы, видимые на экране?) – jfs Jan 09 '16 at 07:43

2 Answers2

1

Я так понял, что вам нужно в заданной строке найти слово, в котором число УНИКАЛЬНЫХ символов минимально (сколько раз они повторяются неважно)? Тогда что-то типа такого (если разделитель слов — пробелы):

def f(string):
    for i in string.split(' '):
        if (len(set(string)) > len(set(i))):
            string = i
    return string

UPD

Добавил вариант на случай ввода строки в форме NFD (спасибо @jfs):

import regex
def f1(string):

    def uniq(s):
        return regex.findall(r'\X', s, regex.U)

    for i in string.split(' '):
        if (len(uniq(string)) > len(uniq(i))):
            string = i
    return string
Flowneee
  • 3,787
  • поправьте отступ -- это имеет значение в Питоне. Следует уточнить что символом является (знать о Unicode normalization forms и eXtended grapheme clusters) иначе сюрпризы будут, например – jfs Jan 09 '16 at 07:50
  • @jfs спасибо за комментарий, при переносе из редактора таки не поставил нужное количество пробелов. А насчет символов: не вижу смысла передавать строку в форме u'\u0435\u0308' в третьем питоне (мало того, что до 3.3 не поддерживалось, так еще и пример по вашей ссылке например не всегда получается воспроизвести (на Win7 Python 3.4.3 не работает, на той же версии питона в убунте работает)). PS а почему в ответе по ссылке не используете встроенный модуль re? – Flowneee Jan 09 '16 at 17:54
  • Вы понимаете что способ ввода тут не причём? Вы не контролируете что вам на вход может прийти. Если не знаете что такое NFD или что re не поддерживает \X, то хотя бы попробовали бы код прежде чем комментировать. – jfs Jan 09 '16 at 18:18
  • regex.findall() возвращает список, вы хотите len(set() вызвать дополнительно. Человеко-читаемые буквы могут состоять из нескольких Unicode codepoints и в NFC. Для ясности, я бы изолировал функцию, которая разбивает текст на слова, от функции, которая работает пытается минимум найти -- у вас неверная реализация. – jfs Jan 12 '16 at 08:34
  • @jfs да, не заметил, что забыл len, сейчас поправлю – Flowneee Jan 12 '16 at 15:40
0

Если символ это Unicode codepoint, то чтобы найти слово с минимальным кол-вом символов из списка words:

word = min(words, key=lambda w: len(set(w)))

Если символ это символ, видимый пользователю (grapheme cluster):

import regex as re # pip install regex
word = min(words, key=lambda w: len(set(re.findall(r'\X', w))))

Если слова в тексте разделены символами пробелов (включая новый строки и Юникодные символы), то words = text.split().

jfs
  • 52,361