如何从纯文本中捕获字典键?

时间:2017-05-19 01:31:25

标签: python dictionary

该研究的主题取自Text processing and detection from a specific dictionary in python主题。也许我误解了OP的问题,但我试图改进代码。所以,也许我的问题可能有点不同。在解释我想做什么之前,让我与你分享一些代码:

dict_1={"Liquid Biopsy":"Blood for analysis","cfDNA":"Blood for analysis"}
list_1=[u'Liquid', u'biopsy',u'based', u'on', u'circulating', u'cell-free', u'DNA', u'(cfDNA)', u'analysis', u'are', u'described', u'as', u'surrogate', u'samples', u'for', u'molecular', u'analysis.']
for i in dict_1:
    if i.lower() in " ".join(list_1).lower():
        print("Key: {}\nValue: {}\n".format(i,dict_1[i]))

这些代码可以从list_1中编写的纯文本中捕获字典键。但是,当我使用这些代码学习时,我想知道如果某些字典键在list_1中重复了。然后我在这个list_1中写了两次相同的密钥。并且上述代码没有认识到重复的代码,程序给出了与下面相同的结果。

Key: cfDNA
Value: Blood for analysis

Key: Liquid Biopsy
Value: Blood for analysis


Process finished with exit code 0

然后我尝试更改我的方法并编写了一个不同的代码,如下所示:

dict_1={"Liquid Biopsy":"Blood for analysis","cfDNA":"Blood for analysis"}
list_1=[u'Liquid', u'biopsy',u'based', u'on', u'circulating', u'cell-free', "cfdna",u'DNA', u'(cfDNA)', u'analysis', u'are', u'described', u'as', u'surrogate', u'samples', u'for', u'molecular', u'analysis.']
for i in list_1:
    for j in dict_1:
        for k in j.split():
            count=0
            if k.lower() in i.lower():
                count+=1
                print("Key: {}\nValue: {}\nCount: {}\nDescription: Came from '{}'\n".format(j, dict_1[j],str(count),i))

但很明显,最后的代码会产生不良后果。如下所示,该程序可以捕获liquid中的biopsylist_1个单词。在cfDNA中第二次写了list_1,所以程序会抓到两次。但是有可能一次写出结果但总结了捕获时间吗?

Key: Liquid Biopsy
Value: Blood for analysis
Count: 1
Description: Came from 'Liquid'

Key: Liquid Biopsy
Value: Blood for analysis
Count: 1
Description: Came from 'biopsy'

Key: cfDNA
Value: Blood for analysis
Count: 1
Description: Came from 'cfdna'

Key: cfDNA
Value: Blood for analysis
Count: 1
Description: Came from '(cfDNA)'


Process finished with exit code 0

我希望你明白我想做什么。我想要捕获所有用文本写的密钥。而且我想计算多少次,这些键在文本中重复。

2 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望找到“关键字”出现在文本中的次数。您可以使用“re”模块。

import re

dict_1={"Liquid Biopsy":"Blood for analysis","cfDNA":"Blood for analysis", "asfdafaf":"dunno"}
list_1=[u'Liquid', u'biopsy',u'based', u'on', u'circulating', u'cell-free', "cfdna",u'DNA', u'(cfDNA)', u'analysis', u'are', u'described', u'as', u'surrogate', u'samples', u'for', u'molecular', u'analysis.']

text = ' '.join(list_1).lower()

for key in dict_1:
    n = len(re.findall(key.lower(), text))
    if n > 0:
        print('Key:', key)
        print('Value:', dict_1[key])
        print('n:', n)
        print()

答案 1 :(得分:0)

最近,我学会了一种新方法,用于计算字典键在纯文本中重复多少次而不导入“re”模块。也许在这个主题中加入另一种方法是合适的。

dict_1={"Liquid Biopsy":"Blood for analysis","cfDNA":"Blood for analysis"}
list_1=[u'Liquid', u'biopsy', u'liquid', u'biopsy',u'based',u'cfdna' ,u'on', u'circulating', u'cell-free', u'DNA', u'(cfDNA)', u'analysis', u'are', u'described', u'as', u'surrogate', u'samples', u'for', u'molecular', u'analysis.']
string_1=" ".join(list_1).lower()
for i in dict_1:
    if i.lower() in string_1:
        print("Key: {}\nValue: {}\nCount: {}\n".format(i,dict_1[i],string_1.count(i.lower())))

上述代码与导入re模块的方法给出的结果几乎相同。不同的是,它不会两次写密钥。所以它有点类似于第一篇文章中写的第一个代码结构。

Key: Liquid Biopsy
Value: Blood for analysis
Count: 2

Key: cfDNA
Value: Blood for analysis
Count: 2


Process finished with exit code 0