如何在Python字典中查找和存储字符串中出现的子字符串的数量?

如何在Python字典中查找和存储字符串中出现的子字符串的数量?,python,matrix,Python,Matrix,我有个问题,不知道如何创建矩阵 我有一本这类词典: dico = { "banana": "sp_345", "apple": "ap_456", "pear": "pe_645", } 还有这样一个文件: sp_345_4567 pe_645_4567876 ap_456_45678 pe_645_4556789 sp_345_567 pe_645_45678 pe_645_45678 ap_456_345678 sp_345_56789 ap_456_345 pe_6

我有个问题,不知道如何创建矩阵

我有一本这类词典:

dico = {
"banana": "sp_345",
"apple": "ap_456",
"pear": "pe_645",
}

还有这样一个文件:

sp_345_4567 pe_645_4567876  ap_456_45678    pe_645_4556789
sp_345_567  pe_645_45678
pe_645_45678    ap_456_345678
sp_345_56789    ap_456_345
pe_645_45678    ap_456_345678
sp_345_56789    ap_456_345
s45678  f45678  f456789 ap_456_52546135
我想做的是创建一个矩阵,在这个矩阵中,我们可以从行中的字典中找到n倍以上的值

这就是我想要继续的方式:

步骤1:创建包含相关值和行数的字典:

就像这样:

dictionary = {'1': 'sp_345_4567','pe_645_4567876', 'ap_456_45678', 'pe_645_4556789'; '2': 'sp_345_567', 'pe_645_45678'; '3:' 'pe_645_45678','ap_456_345678'; '4:' etc ..
然后,我想将这些值与我的第一个名为dico的字典进行比较,例如,查看香蕉键在每行中出现的次数(因此,对字典中的所有键进行比较)但问题是,我的dico的值与我的字典的值不相等,因为它们后面跟有这个模式“\uw+”

我们的想法是制作一个最终的命令,看起来像这样,以便能够在最后制作一个矩阵:

final_dict = {'line1': 'Banana' : '1' ; 'Apple': '1'; 'Pear':2; 'line2': etc ...
以下是我的代码,它不起作用:

import pprint
import re
import csv

dico = {
    "banana": "sp_345",
    "apple": "ap_456",
    "pear": "pe_645",
}

dictionary = {}
final_dict = {}
cnt = 0
with open("test.txt") as file :
    reader = csv.reader(file, delimiter ='\t')
    for li in reader:
        grp = li
        number = 1
        for li in reader:
            dictionary[number] = grp
            number += 1
            pprint.pprint(dictionary)
            number_fruit = {}
            for key1, val1 in dico.items():
                for key2, val2 in dictionary.items():
                     if val1 == val2+'_\w+':
                         final_dict[key1] = val2
谢谢你的帮助

编辑:

我试过使用听写理解

import csv
import re

dico = {
    "banana": "sp_345",
    "apple": "ap_456",
    "pear": "pe_645",
}

with open("test.txt") as file :
    reader = csv.reader(file, delimiter ='\t')
    for li in reader:
        pattern = re.search(dico["banana"]+"_\w+", str(li))
        if pattern:
            final_dict = {"line" + str(index + 1):{key:line.count(text) for key, text in dico.items()} for index, line in enumerate(reader)}
        print(final_dict)
但当我打印最后一本字典时,它只为香蕉放了0

{'line1': {'banana': 0, 'apple': 0, 'pear': 0}, 'line2': {'banana': 0, 'apple': 0, 'pear': 0}, 'line3': {'banana': 0, 'apple': 0, 'pear': 0}, 'line4': {'banana': 0, 'apple': 0, 'pear': 0}, 'line5': {'banana': 0, 'apple': 0, 'pear': 0}, 'line6': {'banana': 0, 'apple': 0, 'pear': 0}}

所以,是的,现在看起来更像我想要的,但发生率没有上升也许我的情况应该在听写理解中???为什么它不起作用

你的测试

如果val1==val2+'\uw+':
...
不起作用,因为您正在测试
val1
val2+'\uw+'
之间的字符串相等性,这两个字符串可能是
“sp\u 345\u 4567”
,它们不相等

你能做些什么

  • 例如,您可能需要测试安全壳
如果val1在val2中:
...
您可以检查“sp_345_4567”中的
“sp_345”
是否返回
true

  • 您可能还希望实际计算另一个字符串中出现的次数
    “sp_345”
    ,您可以使用
    。count
“sp_345_567 pe_645_45678”。计数(“sp_345”)#返回1
“sp_345_567 pe_645_45678”。count(“”)#返回2
  • 您也可以使用正则表达式来完成此操作,因为您已经尝试:
重新导入
pattern=“sp_345_”+“\\w+”
如果重新匹配(模式,“sp_345_4567”):
#找到了图案!在这里做事。
通过
#或者:
打印(关于findall(图案,“sp_345_4567”))
#打印['sp_345_4567']
你如何应用它来构建你的
最终宣言

您可以使用字典理解以更简单的方式重写代码:

导入csv
dico={
“香蕉”:“sp_345”,
“苹果”:“ap_456”,
“pear”:“peu 645”,
}
打开(“test.txt”)作为文件:
reader=csv.reader(文件,分隔符='\t')
final_dict={“line”+str(index+1):{key:line.count(text)用于key,text in dico.items()}用于index,line in enumerate(reader)}
我正在用
“line1”
“line2”
等键构建一个外部字典。。。对于它们中的每一个,值都是一个内部字典,里面有
“banana”
“apple”
等键,每个值都是它们在行中出现的次数

如果您想知道
banana
4
行上出现了多少次,您可以使用

print(最终指令[“line4”][“banana”])
请注意,我建议使用列表而不是字典将结果映射到行号,这样前面的查询将变成:

打印(最终列表[3][“香蕉”])

谢谢你的帮助!但这并不是我想要的最后一句话:/不,它确实没有,但人们也不是为你写代码的地方:)我想你有足够的能力去做,如果你认为你没有,你仍然可以对一个特定的问题发表评论,我会回答,或者你甚至可以问另一个关于你所面临的另一个具体问题的问题。是的,我知道:)Thx那真的很好,我只是想知道这是从词汇表制作矩阵的最佳策略,还是有一些不那么复杂的方法,根据你的评论,我编辑了我的文章,包括了
final_dict
的结构。希望有帮助!哦,那好吧,但是你帮我做了一个很好的辞典,所以我会放一个V