比较不同大小和数据的列表以输出不同的

2024-05-05 00:51:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个个人项目编写一个程序,以便更好地理解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只将放入另一个文本文档中。在

因此,程序将执行以下操作过程:(这是当前程序的工作方式,当比较两个文本时,相同的参数数量请将此流程图稍加保留,它并不意味着完全代表程序,只需给出程序如何工作的总体概念)Flowchart

所以最终我的输出应该是:

outputext

请记住,我不关心参数是否存在于文本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]))

Tags: 文件in文本程序txtformat元素列表
3条回答

创建两个字典并将文件的值解析为字典的相应键和值。遍历第一个字典并比较这些值。在

d1 = {"Tiger":9495, "Data3":5, "Data4":2}
d2 = {"Tiger":94, "Data4":2}

for key, value in d1.items():
    if key in d2:
        if value == d2[key]:
            #same thing
        else:
            #different
    else:
        #d2 doesn't have key

你会从中受益匪浅。首先,您可以使用以下方法从每个文件快速创建词典:

d1 = dict(l.strip().split('=') for l in open('file1.txt'))

这将给你一个更干净的方式来访问你的个人价值观。接下来,在比较这两本词典时,这样做是相当合理的:

^{pr2}$

程序中的根本问题是找出两个序列之间的差异,这是最长公共子序列问题(LCS,参见https://en.wikipedia.org/wiki/Longest_common_subsequence_problem)的派生问题。 它的解决办法并不简单。在Python中,可以使用difflib库来处理此类问题。在

# Assuming you have already parsed the files into two lists

from difflib import SequenceMatcher, Differ
params1 = [
    ('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)
]
params2 = [
    ('Dog', 123),
    ('Cat', '127.0.0.1'),
    ('Data2', 9498),
    ('Eagle', ''),
    ('Tiger', 9495),
    ('Data3', 5),
    ('Data4', 2),
    ('Rock', 52),
    ('Mountain', 380),
    ('Falcon', 627)
]

# If the order of the entries in the file is not mandatory you could sort the lists
matcher = SequenceMatcher(None, params1, params2)
if matcher.ratio() != 1:
    print 'Sequences are not equal'
    print list(Differ().compare(params1, params2)) # Prints the difference

您还可以通过以下方式获得在params2中转换params1的操作:

^{pr2}$

或匹配块:

matcher.get_matching_blocks()

有了这些数据,你只需做一点工作就可以在屏幕上显示差异。在

相关问题 更多 >