Если у меня есть список строк (например, «blah 1», «blah 2», «xyz fg», «xyz penguin»), каков будет лучший способ найти уникальные начала строк («xyz» и «бла» в этом случае)? Начало строк может быть несколькими словами.
Ваш вопрос сбивает с толку, так как не ясно, чего вы действительно хотите. Поэтому я дам три ответа и надеюсь, что один из них хотя бы частично ответит на ваш вопрос.
Чтобы получить всех уникальных префиксов заданного списка строк, вы можете сделать:
>>> l = ['blah 1', 'blah 2', 'xyz fg', 'xyz penguin'] >>> set(s[:i] for s in l for i in range(len(s) + 1)) {'', 'xyz pe', 'xyz penguin', 'b', 'xyz fg', 'xyz peng', 'xyz pengui', 'bl', 'blah 2', 'blah 1', 'blah', 'xyz f', 'xy', 'xyz pengu', 'xyz p', 'x', 'blah ', 'xyz pen', 'bla', 'xyz', 'xyz '}
Этот код генерирует все начальные фрагменты каждой строки в списке и передает их в set для удаления дубликатов.
set
Чтобы получить все самые большие начальные слова последовательностей, меньшие, чем полная строка, вы можете использовать:
>>> l = ['a b', 'a c', 'a b c', 'b c'] >>> set(s.rsplit(' ', 1)[0] for s in l) {'a', 'a b', 'b'}
Этот код создает набор путем разбиения всех строк в крайнем правом месте, если доступно (в противном случае строка while будет возвращена ).
С другой стороны, чтобы получить все уникальные начальные word последовательности без учета полных строк, вы можете пойти на:
>>> l = ['a b', 'a c', 'a b c', 'b c'] >>> set(' '.join(w[:i]) for s in l for w in (s.split(),) for i in range(len(w))) {'', 'a', 'b', 'a b'}
Этот код разбивает каждое слово на любой пробел и объединяет все начальные фрагменты результирующего списка, кроме самого большого. Этот код имеет ловушку: он будет, например, конвертировать вкладки в пробелы. Это может или не может быть проблемой в вашем случае.
Если вы имеете в виду уникальные первые слова строк (слова, разделенные пробелом), это будет:
arr=['blah 1', 'blah 2' 'xyz fg','xyz penguin'] unique=list(set([x.split(' ')[0] for x in arr]))