我正在尝试创建一个列表,其中保存了此函数中的所有单词以及行号。我认为代码已经完成,但每次其中的列表与另一个列表相同时,所有列表都会被覆盖。
这是代码:
#Python 3.5X
import re
file = open(".\cross.txt", 'r')
def search(s):
find1 = ''
find2 = ''
find3 = ''
dic = {}
pattern = re.compile(r"([a-zA-z_]*)[\s.=(]*([a-zA-Z_]*)[\s.=(]*([a-zA-Z_]*)")
for line, i in enumerate(s.readlines()):
result = pattern.search(i)
find1 = ''
find2 = ''
find3 = ''
find1 = result.group(1)
find2 = result.group(2)
find3 = result.group(3)
y=[line]
if find1 in dic.keys():
tmp=dic.get(find1)
tmp.append(line)
dic[find1] = tmp
else:
dic[find1] = y
if find2 in dic.keys():
tmp=dic.get(find2)
tmp.append(line)
dic[find2] = tmp
else:
dic[find2] = y
if find3 in dic.keys():
tmp=dic.get(find3)
tmp.append(line)
dic[find3] = tmp
else:
dic[find3] = y
return dic
print(search(file))
file.close()
def readin (file):
in_file = open(file,"r")
text = in_file.read()
in_file.close()
return text
{'': [3, 4], 'text': [2, 4], 'file': [0, 1], 'close': [3, 4], 'read': [2, 4], 'in_file': [1, 2, 3], 'def': [0, 1], 'readin': [0, 1], 'return': [4], 'open': [1, 2, 3]}
例如,open仅在第1行中,但它会被覆盖。
修改
我试着找到输入中的所有单词。所以对于第一行,我正在寻找“def”“readin”“file”。现在算法将这个关键字写入一个字典,其中包含出现的行(在本例中为0)。
现在检查下一行 - > “in_file”“打开”“文件”。字典现在应该包含def:[0],readin:[0],in_file:[1],file:[0,1],open:[1]。问题是,它还将[1 []添加到def,因为如果我正在查找文件,我会返回[0]并将所有具有值[0]的关键字更改为[0,1]
最小例子:
l[x] = [0]
l[y] = [0]
new_list = [1]
l[x].append(new_list)
现在l [y]和l [x]是[0,1],但只有l [x]应该是。
答案 0 :(得分:1)
考虑第一次循环执行的情况。即对于文件的第一行:
find1='a', find2='b' and find3='c'.
dic['a'] = y, dic['b'] = y, dic['c'] = y
dic['a'] = dic['b'] = dic['c'] = y = [1]
现在考虑循环第二次执行的情况。即对于文件的第二行:
find1='a', find2='d' and find3='e'
中。if find1 in dic.keys():
的if部分将起作用,它会将2附加到现有列表中:
dic['a'] = [1,2]
dic['a'] = dic['b'] = dic['c'] = [1,2]
dic['d'] = dic['e'] = y = [2]
而不是撰写y = [line]
并将y分配给dic[find1], dic[find2] and dic[find3]
,而不是直接指定列表:
dic[find1] = [line]
dic[find2] = [line]
dic[find3] = [line]
这样您将创建三个单独的列表。