从字典列表中获取关键值

3

我有一个包含字母和频率字典的列表。基本上,我有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
你有三个独立的字典,它们没有任何关联。这意味着没有简单的方式可以遍历它们。为什么你的每个字典只包含两个元素?为什么不使用一个字典,将字母作为键,频率作为值? - Neel
1
你为什么一开始要用53个字典呢?你可以像这样做:freq_dict = {'a': 0, 'b': 0, ...}。然后将频率转换成列表就很容易了。 - Selcuk
只是让我更容易理解。基本上,我的最终列表只是一个字典列表。 - Learner
如果你这么说的话,那么先使用更复杂和不适合的方法来工作会更容易吗?嗯,好吧... - Matthias
3个回答

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()在未打包的列表上分离排序后的频率。 演示
输入一个单词:Hello
('H', 'e', 'o', 'l')
(1, 1, 1, 2)
结果是元组,但您可以使用list(letter_arr)list(num_arr)将其转换为列表。

以前从没想过这个。您先生,非常感谢!刚刚让我的代码变得更短了。还需要学习很多Python的东西。 - Learner

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})

最后,要获取您的两个数组,可以执行以下操作:
letterArr, numArr = zip(*frequencies.items())

这将会给你元组,如果你真的需要列表,只需执行:list(letterArr)

0

你想要一个简单的答案,而不需要像zip、collections、itemgetter等进一步的操作。这个方法只需要三行循环代码就能完成最小化的需求。

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接