[英]Getting key values from a list of dictionaries
我有一個包含字母和頻率字典的列表。 基本上,我每個字母表(小寫和大寫)和空格都有53個字典。
adict = {'Letter':'a', 'Frequency':0}
bdict = {'Letter':'b', 'Frequency':0}
cdict = {'Letter':'c', 'Frequency':0}
如果您輸入一個單詞,它將掃描該單詞並更新其相應字母的頻率。
for ex in range(0, len(temp)):
if temp[count] == 'a': adict['Frequency']+=1
elif temp[count] == 'b': bdict['Frequency']+=1
elif temp[count] == 'c': cdict['Frequency']+=1
例如,我輸入單詞“Hello”,檢測字母H,e,l,l,o並更新其頻率。 非零頻率將被轉移到新列表。
if adict['Frequency'] != 0 : newArr.append(adict)
if bdict['Frequency'] != 0 : newArr.append(bdict)
if cdict['Frequency'] != 0 : newArr.append(cdict)
在此之后,我將newArr按頻率排序並轉移到名為finalArr的新列表。 以下是單詞“Hello”的示例列表內容
{'Letter': 'H', 'Frequency': 1}
{'Letter': 'e', 'Frequency': 1}
{'Letter': 'o', 'Frequency': 1}
{'Letter': 'l', 'Frequency': 2}
現在我想要的是只將鍵值傳遞給2個單獨的列表; letterArr和numArr。 我該怎么做呢? 我想要的輸出是:
letterArr = [H,e,o,l]
numArr = [1,1,1,2]
你為什么不只是使用collections.Counter
。 collections.Counter
? 例如:
from collections import Counter
from operator import itemgetter
word = input('Enter a word: ')
c = Counter(word)
letter_arr, num_arr = zip(*sorted(c.items(), key=itemgetter(1,0)))
print(letter_arr)
print(num_arr)
注意使用sorted()
來增加頻率進行排序。 itemgetter()
用於反轉排序順序,以便首先在頻率上執行排序,然后在字母上執行排序。 然后使用解壓縮列表上的zip()
分隔排序的頻率。
演示
Enter a word: Hello ('H', 'e', 'o', 'l') (1, 1, 1, 2)
結果是元組,但如果需要,可以使用list(letter_arr)
和list(num_arr)
轉換為列表。
我很難理解這個問題的數據結構選擇。 你為什么不跟這樣的字典一起去:
frequencies = { 'H': 1, 'e': 1, 'l': 2, 'o': 1 }
使用計數器更容易實現:
from collections import Counter
frequencies = Counter("Hello")
print(frequencies)
>>> Counter({ 'H': 1, 'e': 1, 'l': 2, 'o': 1 })
然后要添加另一個單詞,您只需使用update
方法:
frequencies.update("How")
print(frequencies)
>>> Counter({'l': 2, 'H': 2, 'o': 2, 'w': 1, 'e': 1})
最后,要獲得2個陣列,您可以:
letterArr, numArr = zip(*frequencies.items())
這會給你元組,如果你真的需要列表,只需: list(letterArr)
你想要一個簡單的答案而不需要像zip,集合,項目等那樣進一步完成。這樣就完成了它的最小化,循環中有3行。
finalArr= [{'Letter': 'H', 'Frequency': 1},
{'Letter': 'e', 'Frequency': 1},
{'Letter': 'o', 'Frequency': 1},
{'Letter': 'l', 'Frequency': 2}]
letterArr = []
numArr = []
for i in range(len(finalArr)):
letterArr.append(finalArr[i]['Letter'])
numArr.append(finalArr[i]['Frequency'])
print letterArr
print numArr
輸出是
['H', 'e', 'o', 'l']
[1, 1, 1, 2]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.