我正在为一个个人项目编写一个程序,以便更好地理解python中的list和dictionary是如何工作的。我是一个业余程序员还在学习。程序的目标是能够读取两个文件,并将这两个文件的参数相互比较,如果其中一个文件的参数不正确或不匹配,它将创建一个具有不正确/不匹配参数的新文件。在
我已经创建了这个程序,程序会按照它的预期来做。但是,当我试图比较参数多于或少于所比较文件的文件时,我遇到了一个错误。简言之,我的列表中的元素数量相同;但是如果列表中的元素不相等,我就会遇到错误,通常是列表索引超出范围。在
据我所知,其要点如下:
我有两个文本文档:
文本a.txt公司名称:
Data1="123.212.2.312"
Dog=12
Cat="127.0.0.1"
Data2=9498
Fish=""
Tiger=9495
Data3=5
Data4=2
Game=55
Tree=280
Falcon=67
Bear=2
在文本B.txt公司名称:
^{pr2}$我们可以看到两个文本文档中都缺少参数,而且两个文档中的某些参数都不正确,因此我想输出中的差异文本a.txt只将放入另一个文本文档中。在
因此,程序将执行以下操作过程:(这是当前程序的工作方式,当比较两个文本时,相同的参数数量请将此流程图稍加保留,它并不意味着完全代表程序,只需给出程序如何工作的总体概念):
所以最终我的输出应该是:
请记住,我不关心参数是否存在于文本B.txt但不是在文本a.txt;我关心的是如果参数存在于文本a.txt而不是在文本B.txt我知道这让人困惑,但希望这张照片能把事情弄清楚。在
至于我的代码,这是一段很长的代码,但重要的部分如下:请注意,我也使用PYQT4作为gui。在
with open(compareResults, 'wb') as fdout:
for index, tabName in enumerate(setNames):
tabWidget = QtGui.QWidget()
tabLabel = QtGui.QTextEdit()
print "Tab Name is :{}".format(tabName)
fdout.write('{}'.format(tabName) + '\r\n')
nameData = lst[index]
print 'name data = {}'.format(nameData)
for k in nameData:
if nameData[k] != correct_parameters[k]:
tabLabel.setTextColor(QtGui.QColor("Red"))
tabLabel.append('This Parameter is Incorrect: {} = {}'.format(k, nameData[k]))
fdout.write('\t' + '|' + 'This Parameter is Incorrect: {} = {}'.format(k, nameData[k]) + '\t' + '|' + '\r\n')
print ('{} = {}'.format(k, nameData[k]))
elif nameData[k] == correct_parameters[k]:
tabLabel.setTextColor(QtGui.QColor("Black"))
tabLabel.append('{} = {}'.format(k, nameData[k]))
fdout.write('\t' + '|' + '{} = {}'.format(k, nameData[k]) + '\t' + '|' + '\r\n')
print ('{} = {}'.format(k, nameData[k]))
tabLayout = QtGui.QVBoxLayout()
tabLayout.addWidget(tabLabel)
tabWidget.setLayout(tabLayout)
self.tabWidget.addTab(tabWidget, tabName)
我相信我对代码的缺点是,我循环了一组元素,并且在遍历两个列表时期望相同数量的元素。当列表的元素数目不相同时,如何才能循环使用它们?在
如果问题太复杂或您需要更多信息/代码,请让我知道,我会编辑问题。在
编辑:为了澄清,我最终使用了@CarsonCrane的答案,因为它帮助我创建了我需要的循环,这就是我现在的代码:
for k in nameData:
if k in correct_parameters:
if nameData[k] != correct_parameters[k]:
tabLabel.setTextColor(QtGui.QColor("Red"))
tabLabel.append('This Parameter is Incorrect: {} = {}'.format(k, nameData[k]))
fdout.write('\t' + '|' + 'This Parameter is Incorrect: {} = {}'.format(k, nameData[k]) + '\t' + '|' + '\r\n')
print ('{} = {}'.format(k, nameData[k]))
elif nameData[k] == correct_parameters[k]:
tabLabel.setTextColor(QtGui.QColor("Black"))
tabLabel.append('{} = {}'.format(k, nameData[k]))
fdout.write('\t' + '|' + '{} = {}'.format(k, nameData[k]) + '\t' + '|' + '\r\n')
print ('{} = {}'.format(k, nameData[k]))
else:
tabLabel.setTextColor(QtGui.QColor("Blue"))
tabLabel.append('{} = {} does not appear in our default'.format(k, nameData[k]))
fdout.write('\t' + '|' + '{} = {} does not appear in our default'.format(k, nameData[k]) + '\t' + '|' + '\r\n')
print ('{} = {} does not appear in our default'.format(k, nameData[k]))
创建两个字典并将文件的值解析为字典的相应键和值。遍历第一个字典并比较这些值。在
你会从中受益匪浅。首先,您可以使用以下方法从每个文件快速创建词典:
这将给你一个更干净的方式来访问你的个人价值观。接下来,在比较这两本词典时,这样做是相当合理的:
^{pr2}$程序中的根本问题是找出两个序列之间的差异,这是最长公共子序列问题(LCS,参见https://en.wikipedia.org/wiki/Longest_common_subsequence_problem)的派生问题。 它的解决办法并不简单。在Python中,可以使用
difflib
库来处理此类问题。在您还可以通过以下方式获得在
^{pr2}$params2
中转换params1
的操作:或匹配块:
有了这些数据,你只需做一点工作就可以在屏幕上显示差异。在
相关问题 更多 >
编程相关推荐