2015-11-15 4 views
2

Используя следующий код из https://stackoverflow.com/a/11899925, я могу найти, если слово является уникальным или нет (путем сравнения, если он был использован один или более чем один раз):Подсчет количества уникальных слов в списке

helloString = ['hello', 'world', 'world'] 
count = {} 
for word in helloString : 
    if word in count : 
     count[word] += 1 
    else: 
     count[word] = 1 

Но, если бы у меня была строка с сотнями слов, как бы я мог подсчитать количество уникальных слов внутри этой строки?

Например, мой код имеет:

uniqueWordCount = 0 
helloString = ['hello', 'world', 'world', 'how', 'are', 'you', 'doing', 'today'] 
count = {} 
for word in words : 
    if word in count : 
     count[word] += 1 
    else: 
     count[word] = 1 

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

+0

Есть 6 уникальных слов, а не 5 –

+1

7 уникальных слов не 6 –

ответ

10

Лучший способ для решения этой проблемы является используйте тип коллекции set. A set - это коллекция, в которой все элементы уникальны. Поэтому:

unique = set([ 'one', 'two', 'two']) 
len(unique) # is 2 

Вы можете использовать набор с самого начала, добавив к ней слова, как вы идете:

unique.add('three') 

Это сбросит все дубликаты, как они будут добавлены. Или вы можете собрать все элементы в списке и передать список функции set(), которая в это время удалит дубликаты.Пример, который я Приведенный выше показывает эту закономерность:

unique = set([ 'one', 'two', 'two']) 
unique.add('three') 

# unique now contains {'one', 'two', 'three'} 

Read more about sets in Python.

1

В текущем коде можно либо увеличивать uniqueWordCount в else случае, когда вы уже создали count[word], или просто выполните поиск количество ключей в словаре: len(count).

Если вы хотите знать количество уникальных элементов, а затем получить элементы в set: len(set(helloString))

5

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


Set

Вы также можете преобразовать список в набор, в котором все элементы должны быть уникальными. Не уникальные элементы отбрасываются:

helloString = ['hello', 'world', 'world', 'how', 'are', 'you', 'doing', 'today'] 
helloSet = set(helloString) #=> ['doing', 'how', 'are', 'world', 'you', 'hello', 'today'] 
uniqueWordCount = len(set(helloString)) #=> 7 

Вот ссылка для дальнейшего чтения на sets

Счетчик

Вы также можете использовать счетчик, который также может сказать вам, как часто использовали слово, если вам все равно нужна эта информация.

from collections import Counter 

helloString = ['hello', 'world', 'world', 'how', 'are', 'you', 'doing', 'today'] 
counter = Counter(helloString) 
len(counter) #=> 7 
counter["world"] #=> 2 

Loop

В конце для вашего цикла, вы можете проверить len из count, также, вы неправильно набранный helloString в words:

uniqueWordCount = 0 
helloString = ['hello', 'world', 'world', 'how', 'are', 'you', 'doing', 'today'] 
count = {} 
for word in helloString: 
    if word in count : 
     count[word] += 1 
    else: 
     count[word] = 1 
len(count) #=> 7 
+0

Ваша версия петли просто повторяет то, что набор делает, поскольку набор является в основном словарем с игнорируемыми значениями. – jamylak

+0

@jamylax, да, но я включил его, чтобы OP хотел более подробный (именно поэтому я также включил набор). Я переместил пример цикла к кнопке. –

+0

Нет причин для 'count' быть словарем, если вы всегда устанавливаете значения всегда' True'. Измените его на 'set' – jamylak

-1

Я хотел бы сделать это с помощью набора.

def stuff(helloString): 
    hello_set = set(helloString) 
    return len(hello_set) 
+0

То же самое, что и что? – NotAnAmbiTurner

+0

То же самое * как какой *? Вы имеете в виду тот же ответ, что и вы, как я писал, и поэтому не могли видеть эту страницу? Спасибо что подметил это. Для записи я сделал свой ответ ... – NotAnAmbiTurner

+0

Думал, что вы сказали «вместо того, чтобы использовать». Виноват. Удалено проголосовало. –

4

Вы можете использовать collections.Counter

helloString = ['hello', 'world', 'world'] 

from collections import Counter 

c = Counter(helloString) 

print("There are {} unique words".format(len(c))) 
print('They are') 

for k, v in c.items(): 
    print(k) 

Я знаю, что этот вопрос конкретно не просил об этом, но для поддержания порядка

helloString = ['hello', 'world', 'world', 'how', 'are', 'you', 'doing', 'today'] 

from collections import Counter, OrderedDict 

class OrderedCounter(Counter, OrderedDict): 
    pass 

c = OrderedCounter(helloString) 

print("There are {} unique words".format(len(c))) 
print('They are') 

for k, v in c.items(): 
    print(k) 
+0

Не знаю, может, кто-то подумал, что я скопировал. Я этого не сделал. Но, как вы ответили первым, и эти ответы по сути то же самое, я не возражаю, отказываясь от ответа. –

+0

Дал вам голосование, это тоже хороший ответ. –

0

I может быть неправильное вопрос, но я считаю, цель состоит в том, чтобы найти все элементы, которые происходят только один раз в списке.

from collections import Counter 
helloString = ['hello', 'world', 'world', 'how', 'are', 'you', 'doing', 'today'] 
counter = Counter(helloString) 
uniques = [value for value, count in counter.items() if count == 1] 

Это даст нам 6 пунктов, потому что «мир» происходит дважды в нашем списке:

>>> uniques 
['you', 'are', 'doing', 'how', 'today', 'hello']