我试图使用嵌套列表中的字典来计算单词的频率。每个嵌套列表都是分成每个单词的句子。另外,我想删除句子开头的专有名词和小写单词。是否有可能获得专有名词?
x = [["Hey", "Kyle","are", "you", "doing"],["I", "am", "doing", "fine"]["Kyle", "what", "time" "is", "it"]
from collections import Counter
def computeFrequencies(x):
count = Counter()
for listofWords in L:
for word in L:
count[word] += 1
return count
返回错误:不可用类型:' list'
我想在没有字典周围的Counter()的情况下返回这个:
{"hey": 1, "how": 1, "are": 1, "you": 1, "doing": 2, "i": , "am": 1, "fine": 1, "what": 1, "time": 1, "is": 1, "it": 1}
答案 0 :(得分:7)
由于您的数据是嵌套的,因此您可以使用chain.from_iterable
这样将其展平
from itertools import chain
from collections import Counter
print Counter(chain.from_iterable(x))
# Counter({'doing': 2, 'Kyle': 2, 'what': 1, 'timeis': 1, 'am': 1, 'Hey': 1, 'I': 1, 'are': 1, 'it': 1, 'you': 1, 'fine': 1})
如果要使用生成器表达式,则可以执行
from collections import Counter
print Counter(item for items in x for item in items)
如果你想在不使用Counter的情况下这样做,那么你可以使用像这样的普通词典
my_counter = {}
for line in x:
for word in line:
my_counter[word] = my_counter.get(word, 0) + 1
print my_counter
您也可以使用collections.defaultdict
,就像这样
from collections import defaultdict
my_counter = defaultdict(int)
for line in x:
for word in line:
my_counter[word] += 1
print my_counter
好的,如果您只是想将Counter
对象转换为dict
对象(我认为根本没有必要,因为Counter
实际上是一个字典。您可以访问密钥-values,iterate,delete就像普通字典对象一样更新Counter
对象),你可以使用bsoist's suggestion,
print dict(Counter(chain.from_iterable(x)))
答案 1 :(得分:2)
问题在于您正在迭代L
两次。
替换内循环:
for word in L:
使用:
for word in listofWords:
但是,如果想去" pythonic" - 查看@ thefourtheye的解决方案。