从字典列表中获取键值

时间:2016-05-07 12:02:40

标签: python list dictionary

我有一个包含字母和频率字典的列表。基本上,我每个字母表(小写和大写)和空格都有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]

3 个答案:

答案 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]