如何在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