如何在python中显示与文本文件差异最大的前两行例如,这里有一个文本文件:
Mazda 64333 53333
Merce 74321 54322
BMW 52211 31432
预期输出为
Merce 74321 54322
BMW 52211 31432
我尝试了多个代码,但只显示了实际的差异,而不是整行。
这对你有用吗?
from operator import itemgetter
with open("x.txt", "r+") as data:
data = [i.split() for i in data.readlines()]
top = sorted([[row[0], int(row[1])-int(row[2])]for row in data],key=itemgetter(1), reverse=True)
print(top)
print(top[:2])
[['BMW', 20779], ['Merce', 19999], ['Mazda', 11000]]
[['BMW', 20779], ['Merce', 19999]]
所以,乍一看,这可能看起来有点复杂,但事实并非如此!
让我们分解一下下面程序的每个步骤
from operator import itemgetter
with open("x.txt", "r+") as data:
data = [i.split() for i in data.readlines()]
top = sorted([[row[0], int(row[1])-int(row[2])]for row in data],key=itemgetter(1), reverse=True)
现在,我们首先要注意,operator
是一个内置包,它不是像请求这样的库的外部导入,itemgetter
是一个非常简单的函数。
with open("x.txt", "r+") as data
也应该非常直接。。。所做的只是打开一个具有读取权限的文本文件,并将该对象存储在data
中。
然后我们使用我们的第一个列表理解,这对你来说可能是新的。。。
data = [i.split() for i in data.readlines()]
所有这些都是通过每一行(例如car 123 122
(,并将其按空格拆分为类似["car", "123", "122"]
的列表。
现在,如果你仔细观察它的产物,就会发现有些问题。最后两个元素(需要是整数才能找到差异(是字符串!因此,为什么我们必须使用下一个列表理解来改变这一点。
top = sorted([[row[0], int(row[1])-int(row[2])]for row in data],key=itemgetter(1), reverse=True)
这有点复杂。。。但它真正做的只是对一个简单的列表理解进行排序。
它遍历data
中的每个值并得到差异!让我们看看它是如何做到这一点的。
正如您所知,我们的数据现在看起来有点像[["car", "123", "122"], ["car1", "1234", "1223"]]
。因此,我们可以用[1]
和[2]
访问["car", "123", "122"]
的整数值,有了这些知识,我们可以对数据进行循环,并获得它们被转换为整数时的差值。例如CCD_ 13的CCD_ 12将返回CCD_。
有了这些知识,我们可以创建一个新的列表,其中包含:汽车名称row[0]
和列表comp中由[row[0], int(row[1])-int(row[2])]
表示的差异int(row[1])-int(row[2])
。当在数据中使用行作为每个可迭代项时,我们可以很容易地形成这个!以下是清单本身的理解:
[[row[0], int(row[1])-int(row[2])] for row in data]
最后,我们来到了这个小程序的最后一部分。。。sorted
功能!sorted()
将根据您给它的键返回一个排序列表(您可以使用reverse=True
首先获得最大值(。当它缩写如下时,其实并不难理解:
sorted([the list comprehension],key=itemgetter(1), reverse=True)
所以,虽然你可能知道,是的,它是对我们所做的列表理解进行排序,并首先列出最大的值,但你可能不知道它是如何排序的!要知道它是如何排序的,我们需要查看key
。
CCD_ 22是运算符类的函数。关于它,你真正需要知道的是,它得到了给定列表的第一个索引,并因此进行排序。如果您能回忆起我们数据中的每个元素看起来都像["car", difference]
(difference
只是实际整数差的占位符(。既然我们想要最大的差异,那么按它们排序是有意义的,对吧?
使用CCD_ 25,它将按照第一个索引进行排序差异!这几乎可以概括为:(
我们将所有这些存储到变量top
中,然后使用print(top[:2])
打印前两个元素
我希望这能有所帮助!
创建一个dict
,其中包含以汽车品牌为关键的每一行的距离。然后,您可以使用values
对dict.items()
进行排序,并返回前2个