2012-09-05 72 views
40

所以我試圖讓這個程序會要求用戶輸入並將值存儲在數組/列表中。
然後當輸入一個空白行時,它會告訴用戶有多少這些值是唯一的。
我爲了現實生活的原因而不是將它作爲問題設置來構建。如何在Python中對數組中的唯一值進行計數?

enter: happy 
enter: rofl 
enter: happy 
enter: mpg8 
enter: Cpp 
enter: Cpp 
enter: 
There are 4 unique words! 

我的代碼如下:

# ask for input 
ipta = raw_input("Word: ") 

# create list 
uniquewords = [] 
counter = 0 
uniquewords.append(ipta) 

a = 0 # loop thingy 
# while loop to ask for input and append in list 
while ipta: 
    ipta = raw_input("Word: ") 
    new_words.append(input1) 
    counter = counter + 1 

for p in uniquewords: 

..和這就是全部到目前爲止,我已經得到了。
我不確定如何計算列表中單詞的唯一數量?
如果有人可以發佈解決方案,以便我可以從中學習,或至少告訴我它會是多麼棒,謝謝!

+3

您可以修復縮進您的代碼示例,它在Python重要! – codebox

+0

你已經刪除了你的代碼,而不是編輯它,使它可讀!代碼有幫助很多... – Hbcdev

+0

@codebox抱歉現在會做 –

回答

95

可以使用set刪除重複,然後len函數計算集合中的元素:

len(set(new_words)) 
13

使用set

words = ['a', 'b', 'c', 'a'] 
unique_words = set(words)    # == set(['a', 'b', 'c']) 
unique_word_count = len(unique_words) # == 3 

有了這些,您的解決方案可以如此簡單:

words = [] 
ipta = raw_input("Word: ") 

while ipta: 
    words.append(ipta) 
    ipta = raw_input("Word: ") 

unique_word_count = len(set(words)) 

print "There are %d unique words!" % unique_word_count 
0
ipta = raw_input("Word: ") ## asks for input 
words = [] ## creates list 
unique_words = set(words) 
0

以下應該工作。 lambda函數過濾出重複的單詞。

inputs=[] 
input = raw_input("Word: ").strip() 
while input: 
    inputs.append(input) 
    input = raw_input("Word: ").strip() 
uniques=reduce(lambda x,y: ((y in x) and x) or x+[y], inputs, []) 
print 'There are', len(uniques), 'unique words' 
0

我會使用一套自己,但這裏的另一種方式:

uniquewords = [] 
while True: 
    ipta = raw_input("Word: ") 
    if ipta == "": 
     break 
    if not ipta in uniquewords: 
     uniquewords.append(ipta) 
print "There are", len(uniquewords), "unique words!" 
0
ipta = raw_input("Word: ") ## asks for input 
words = [] ## creates list 

while ipta: ## while loop to ask for input and append in list 
    words.append(ipta) 
    ipta = raw_input("Word: ") 
    words.append(ipta) 
#Create a set, sets do not have repeats 
unique_words = set(words) 

print "There are " + str(len(unique_words)) + " unique words!" 
86

此外,使用collections.Counter重構代碼:

from collections import Counter 


words = ['a', 'b', 'c', 'a'] 

Counter(words).keys() # equals to list(set(words)) 
Counter(words).values() # counts the elements' frequency 
+11

不是Joel的問題的答案,但*完全*我在找什麼,謝謝! –

+0

完美。和一隻公牛的眼睛。謝謝@Vidul –

+0

'Counter(words).values()'很好。我們認爲這個數字是按照第一個出現的單詞列表的順序嗎?我的意思是,我假設伯爵會給我們a的數量,然後b,然後c,然後d ... –

0

雖然set是最簡單的方法,您也可以使用字典並使用​​來填充僅具有唯一鍵和值的字典。

假設您已經填充words[]與來自用戶的輸入,創建一個字典映射列表中的唯一字的數量:

word_map = {} 
i = 1 
for j in range(len(words)): 
    if not word_map.has_key(words[j]): 
     word_map[words[j]] = i 
     i += 1                
num_unique_words = len(new_map) # or num_unique_words = i, however you prefer 
0

對於ndarray有函數調用的唯一 np.unique(ARRAY_NAME )

對於系列有一個函數調用value_counts() exa- Series_name.value_counts()

相關問題