【问题标题】:Python Find & Count Certain Word within (Strings) List ItemsPython在(字符串)列表项中查找和计算某些单词
【发布时间】:2018-07-02 15:41:32
【问题描述】:

亲爱的程序员,你好,

我想在列表项中查找某些单词。我的输入如下所示:

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...

【问题讨论】:

  • split \t 上的字符串。 Counter(s.split('\t')[1] for s in myInputList)

标签: python list search count word


【解决方案1】:

包括 '\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

【讨论】:

  • 谢谢!这行得通! :-) 还有一个问题:现在我只想计算 NN,并且只输出数字,仅此而已。喜欢:1
  • 计数器的结构类似于字典。更新了我的代码。希望对您有所帮助。
【解决方案2】:
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}

如果你想要并且你确定你只想要第二个索引中的元素,那么你可以简单地做

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}

【讨论】:

    【解决方案3】:

    您可以使用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})
    

    【讨论】:

      【解决方案4】:

      应该这样做:

      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
      

      【讨论】:

      • 谢谢。您的代码正在运行。但我尝试对其进行一些修改,例如只计算 NN。你能明白为什么我的错误在哪里吗?我是这样做的: a = ('\tNN\t') myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen'] print(len([i for i in myInputList if (j in i for j in a)])) # 我得到 3 作为结果 # 但我应该得到 1 作为结果
      • @AnnaLise 正如我在编辑中建议的那样使用print(len([i for i in myInputList if any(j in i for j in [a])])),因为... for j in a 将a 拆分为['\t', 'N', 'N', '\t']
      猜你喜欢
      • 2023-03-30
      • 2011-11-09
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多