簡體   English   中英

Python,使用字典和集合來跟蹤一個詞的所有出現

[英]Python, using dictionaries and sets to keep track of all occurences of a word

我正在嘗試解決這個問題:

給你 n 個單詞。 有些話可能會重復。 對於每個單詞,輸出其出現次數。 輸出順序應與單詞出現的輸入順序相對應。 有關說明,請參閱示例輸入/輸出。

注意:每個輸入行都以“\\n”字符結尾。

輸入格式

第一行包含整數 n 。

接下來的 n 行每行包含一個單詞。

輸出格式

輸出 2 行。 在第一行,輸出來自輸入的不同單詞的數量。 在第二行,根據每個不同單詞在輸入中的出現輸出它們的出現次數。

我已經實施了這樣的解決方案,

# Enter your code here. Read input from STDIN. Print output to STDOUT

n  = int(input())

mySet = set()
myDict = {}

for i in range(n):
    inp = input()[:-1]
    if inp not in mySet:
        mySet.add(inp)
        myDict[inp] = 1
    else:
        myDict[inp] += 1

print(len(mySet))
# print(' '.join(list(map(str, myDict.values()))))
print(*myDict.values())

我的策略如下:

如果單詞不在mySet 中,則將其添加到集合中並在myDict上創建一個值鍵對,單詞為鍵,1 為值。

如果該詞已經在集合中,則增加該詞在字典中的值。

然而,一半的測試用例成功了,其余的都是“錯誤的答案”。 所以,我想知道,有人能指出我想添加到這段代碼中的什么嗎?

你的錯誤在於inp = input()[:-1] [:-1]切斷單詞的最后一個字符。 我猜您正在嘗試刪除換行符,但input()已經“剝離尾隨換行符”。 演示:

>>> [input() for _ in range(2)]
foo
bar
['foo', 'bar']

更簡單的解決方案,順便說一句:

from collections import Counter

ctr = Counter(input() for _ in range(int(input())))
print(len(ctr))
print(*ctr.values())

有趣的是,一個棘手的版本(也被接受):

from collections import Counter

ctr = Counter(map(input, [''] * int(input())))
print(len(ctr))
print(*ctr.values())

另一個:

from collections import Counter
import sys

next(sys.stdin)
ctr = Counter(map(str.strip, sys.stdin))
print(len(ctr))
print(*ctr.values())

這個讀取整行,所以這里的字符串確實包含換行符。 如果所有行都有它,那也沒關系,但是不,HackerRank 犯下了不以換行符結束最后一行的大罪。 所以我strip它們趕走的每一行。 嘆。

在問題中,您不需要使用set屬性,並且您使用輸入的方式即 input()[::-1] 是錯誤的,因為它正在反轉您輸入的輸入,即輸入abc it將其存儲為cba

現在要解決問題,因為 OP 已經想出采用唯一的項目使用集,並獲得每個單詞使用字典的頻率。 但是使用 set 是昂貴的操作,並且字典可用於獲取唯一詞,因為它存儲可用於獲取唯一元素的唯一鍵,並使用與您正在執行的操作相同的操作來獲取頻率。

而不是通過dict[key]=value value 在字典中添加 key, value 更好地使用 inbuild 方法更新當前字典,即dict1.update(dict2)其中dict1是原始字典, dict2是帶有鍵和值的新字典, dict2={key:value} ,通過這種方式,您將保持 dict 中元素的順序。

獲取唯一單詞的 len ,字典工作的 len ,即len(dic)並獲取需要打印的每個單詞值的頻率,即print(*dic.values())

n = int(input())
dic  = {}

for _ in range(n):
  w = input()
  if w in dic.keys():
    dic[w]+=1
  else:
    dic.update({w:1})

print(len(dic.keys()))
print(*dic.values())
n=int(input())
word_list=[]
for i in range(n):
    word_list.append(input())
    
New_word_list=[]
for element in word_list:
    if element in New_word_list:
        New_word_list=New_word_list    
    else:
        New_word_list.append(element)

print(len(New_word_list))
for element in New_word_list:
    print(word_list.count(element), end=" ")

輸入:

10
cat
dog
dog
rabbit
cat
pig
horse
pig
pig
goat

結果:

6
2 2 1 3 1 1 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM