我有一个包含字母和频率字典的列表。基本上,我每个字母表(小写和大写)和空格都有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]
答案 0 :(得分:3)
为什么不使用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)
,则可以转换为列表。
答案 1 :(得分:1)
我很难理解这个问题的数据结构选择。 为什么不用这样的词典:
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)
答案 2 :(得分:0)
你想要一个简单的答案而不需要像zip,collection,itemgetter等那样进一步完成。这样就完成了它的最小化,循环中有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]