Python 查找并计算(字符串)列表项中的特定单词
Python Find & Count Certain Word within (Strings) List Items
你好亲爱的程序员,
我想在列表项中查找某些词。我的输入如下所示:
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen'...]
我想查找并计数 \tNN\t 或 \tADJ\t 或 \tVFIN\t。
我要计算的单词的位置总是相同的,就像您在示例中看到的那样。
我尝试了以下代码,但出现以下错误:ValueError too many values to unpack (expected 3)
from collections import Counter
myInputList = Counter([b for a,b,c in myInputList])
print(myInputList)
实际上,我明白为什么这段代码不起作用。但我没有其他方法。
所以我的目标是计算 \t 之间的词性标记。
所以最后我想说:有5个NN,4个ADJA...
应该这样做:
a, b, c = ('\tNN\t', '\tADJ\t', '\tVFIN\t')
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen']
print(len([i for i in myInputList if any(j in i for j in [a, b, c])]))
#3
包括'\t'不存在的情况
from collections import Counter
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen','xyz']
Counter([x.split('\t')[1] for x in myInputList if '\t' in x])
转换成字典
from collections import Counter
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen','xyz']
d=dict(Counter([x.split('\t')[1] for x in myInputList if '\t' in x]))
print(d['NN'])
输出:1
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen']
newList = []
for i in myInputList:
newList.extend(i.split("\t"))
from collections import Counter
Counter(newList)
给予
{'ADJ': 1,
'Haus': 1,
'Hauses': 1,
'NN': 1,
'VFIN': 1,
'gehen': 1,
'geht': 1,
'gut': 1,
'guten': 1}
如果你想要并且你确定你只需要 2ND 索引中的元素,那么你可以简单地做
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen']
newList = []
for i in myInputList:
newList.append(i.split("\t"))
from collections import Counter
onlySecond = [i[1] for i in newList]
dict(Counter(onlySecond))
会给你
{'ADJ': 1, 'NN': 1, 'VFIN': 1}
您可以使用 collections.defaultdict
。如果列表项中可能出现多个值,则可以删除 break
,否则它会在特定字符串的第一个匹配项处停止。
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen']
values = ['\tNN\t', '\tADJ\t', '\tVFIN\t']
from collections import defaultdict
d = defaultdict(int)
for item in myInputList:
for v in values:
if v in item:
d[v] += 1
break
print(d)
defaultdict(int, {'\tADJ\t': 1, '\tNN\t': 1, '\tVFIN\t': 1})
你好亲爱的程序员,
我想在列表项中查找某些词。我的输入如下所示:
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen'...]
我想查找并计数 \tNN\t 或 \tADJ\t 或 \tVFIN\t。 我要计算的单词的位置总是相同的,就像您在示例中看到的那样。
我尝试了以下代码,但出现以下错误:ValueError too many values to unpack (expected 3)
from collections import Counter
myInputList = Counter([b for a,b,c in myInputList])
print(myInputList)
实际上,我明白为什么这段代码不起作用。但我没有其他方法。
所以我的目标是计算 \t 之间的词性标记。 所以最后我想说:有5个NN,4个ADJA...
应该这样做:
a, b, c = ('\tNN\t', '\tADJ\t', '\tVFIN\t')
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen']
print(len([i for i in myInputList if any(j in i for j in [a, b, c])]))
#3
包括'\t'不存在的情况
from collections import Counter
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen','xyz']
Counter([x.split('\t')[1] for x in myInputList if '\t' in x])
转换成字典
from collections import Counter
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen','xyz']
d=dict(Counter([x.split('\t')[1] for x in myInputList if '\t' in x]))
print(d['NN'])
输出:1
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen']
newList = []
for i in myInputList:
newList.extend(i.split("\t"))
from collections import Counter
Counter(newList)
给予
{'ADJ': 1,
'Haus': 1,
'Hauses': 1,
'NN': 1,
'VFIN': 1,
'gehen': 1,
'geht': 1,
'gut': 1,
'guten': 1}
如果你想要并且你确定你只需要 2ND 索引中的元素,那么你可以简单地做
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen']
newList = []
for i in myInputList:
newList.append(i.split("\t"))
from collections import Counter
onlySecond = [i[1] for i in newList]
dict(Counter(onlySecond))
会给你
{'ADJ': 1, 'NN': 1, 'VFIN': 1}
您可以使用 collections.defaultdict
。如果列表项中可能出现多个值,则可以删除 break
,否则它会在特定字符串的第一个匹配项处停止。
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen']
values = ['\tNN\t', '\tADJ\t', '\tVFIN\t']
from collections import defaultdict
d = defaultdict(int)
for item in myInputList:
for v in values:
if v in item:
d[v] += 1
break
print(d)
defaultdict(int, {'\tADJ\t': 1, '\tNN\t': 1, '\tVFIN\t': 1})