Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算列表中的差异_Python_List - Fatal编程技术网

Python 计算列表中的差异

Python 计算列表中的差异,python,list,Python,List,我有两个文件,内容如下: 请仅考虑螺栓柱和红柱。剩下的文本是垃圾和不必要的。从这两个文件中可以明显看出,它们在许多方面是相似的。我试图比较文件_1和文件_2中的粗体文本。它不是粗体的,但希望您能看出它是同一列,如果它们不同,我想打印文件_1中的红色文本。我通过以下脚本实现了这一点: import string import itertools chain_id=[] for file in os.listdir("."): basename = os.path.basename(fil

我有两个文件,内容如下:

请仅考虑螺栓柱和红柱。剩下的文本是垃圾和不必要的。从这两个文件中可以明显看出,它们在许多方面是相似的。我试图比较文件_1和文件_2中的粗体文本。它不是粗体的,但希望您能看出它是同一列,如果它们不同,我想打印文件_1中的红色文本。我通过以下脚本实现了这一点:

import string
import itertools

chain_id=[]
for file in os.listdir("."):
    basename = os.path.basename(file)
    if basename.startswith("d.complex"):
        chain_id.append(basename)

for i in chain_id:
    print i
    g=codecs.open(i,  encoding='utf-8')

    f=codecs.open("ac_chain_dssp.dssp",  encoding='utf-8')
    for (x, y) in itertools.izip(g,  f): 
            if y[11]=="C":
                if y[35:38]!= "EN":
                    if y[35:38] != "OTE":
                        if x[11]=="C":
                            if x[12] != "C":
                                if y[35:38] !=x[35:38]:
                                    print x [7:10]


    g.close()
    f.close()
但是我得到的结果并不是我所期望的。现在我想修改上面的代码,这样当我比较粗体列时,如果值之间的差异大于2,那么它必须打印出结果。例如,文件_1中粗体列的第1行是83,而文件_2中粗体列的第1行是84,因为两者之间的差值小于2,所以我希望它被拒绝

有人能帮我添加剩下的代码吗? 干杯 查瓦纳克


附:这不是家庭作业:

我还没有完全理解你的问题,但是

文件1

100 C 20.2
300 B 33.3
文件2

110 C 20.23
320 B 33.34
您需要比较两个文件的第3列

lines1 = file1.readlines()
list1 = [float(line.split()[2]) for line in lines1] # list of 3rd column values

lines2 = file2.readlines()
list2 = [float(line.split()[2]) for line in lines2]

result = map(lambda x,y: x-y < 2,list1,list2)

这就是你想要的吗?

我还没有完全理解你的问题,但是

文件1

100 C 20.2
300 B 33.3
文件2

110 C 20.23
320 B 33.34
您需要比较两个文件的第3列

lines1 = file1.readlines()
list1 = [float(line.split()[2]) for line in lines1] # list of 3rd column values

lines2 = file2.readlines()
list2 = [float(line.split()[2]) for line in lines2]

result = map(lambda x,y: x-y < 2,list1,list2)

这就是你想要的吗?

你问题的直接答案是改变最后一个条件, 如果y[35:38]=x[35:38]: 因此[35:38]处的字段被转换为int或float。。。不同之处可以应用于它们。提供类似于

   try:
     iy = int(y[35:38])
     ix = int(x[35:38])
   except ValueError:
     # here for whatever action is appropriate, including silent ignoring.
     print("Unexpected value for record # %s" % x[7:10])

   if abs(ix - iy) > 2:
     print(x[7:10])
更间接地说,问题中的片段引发了以下评论,这些评论反过来可能暗示了解决问题的不同方法

首先,如果文件是严格固定格式的,如果文件非常大,并且/或者如果没有对文件中的任何其他字段值进行任何处理,那么当前的方法是有效的,并且可能非常有效。 或者,通过在文件的字段中进行解析,而不是将这些字段作为长字符串的片段进行寻址,可以使逻辑对文件结构等中的可能变化具有更大的弹性。进入标准库的csv模块以获得可能的解析器支持。 有些测试看起来愚蠢/总是正确等,比如将3个字符的片段与2个字符的字符串文本进行比较。除了在逻辑上是错误的之外,这也指向了一个更解析的解决方案,在这个解决方案中,这样的逻辑错误更容易避免或更明显。
你的问题的直接答案是改变最后一个条件, 如果y[35:38]=x[35:38]: 因此[35:38]处的字段被转换为int或float。。。不同之处可以应用于它们。提供类似于

   try:
     iy = int(y[35:38])
     ix = int(x[35:38])
   except ValueError:
     # here for whatever action is appropriate, including silent ignoring.
     print("Unexpected value for record # %s" % x[7:10])

   if abs(ix - iy) > 2:
     print(x[7:10])
更间接地说,问题中的片段引发了以下评论,这些评论反过来可能暗示了解决问题的不同方法

首先,如果文件是严格固定格式的,如果文件非常大,并且/或者如果没有对文件中的任何其他字段值进行任何处理,那么当前的方法是有效的,并且可能非常有效。 或者,通过在文件的字段中进行解析,而不是将这些字段作为长字符串的片段进行寻址,可以使逻辑对文件结构等中的可能变化具有更大的弹性。进入标准库的csv模块以获得可能的解析器支持。 有些测试看起来愚蠢/总是正确等,比如将3个字符的片段与2个字符的字符串文本进行比较。除了在逻辑上是错误的之外,这也指向了一个更解析的解决方案,在这个解决方案中,这样的逻辑错误更容易避免或更明显。
与您的问题无关,但是:

        if y[11]=="C":
            if y[35:38]!= "EN":
# I don't see any "EN" or "OTE" anywhere in your sample input.
# In any case the above condition will always be true, because
# y[35:38] appears to be a 3-byte string but "EN" is a 2-byte string.
                if y[35:38] != "OTE":
                    if x[11]=="C":
                        if x[12] != "C":
                            if y[35:38] !=x[35:38]:
                                print x [7:10]

你可能想考虑另一种表达方式,例如

if (x[11] == "C" == y[11]
and x[12] != "C"
and y[35:38] not in ("EN?", "OTE")
and y[35:38] != x[35:38]):
    print x[7:10]

与您的问题无关,但是:

        if y[11]=="C":
            if y[35:38]!= "EN":
# I don't see any "EN" or "OTE" anywhere in your sample input.
# In any case the above condition will always be true, because
# y[35:38] appears to be a 3-byte string but "EN" is a 2-byte string.
                if y[35:38] != "OTE":
                    if x[11]=="C":
                        if x[12] != "C":
                            if y[35:38] !=x[35:38]:
                                print x [7:10]

你可能想考虑另一种表达方式,例如

if (x[11] == "C" == y[11]
and x[12] != "C"
and y[35:38] not in ("EN?", "OTE")
and y[35:38] != x[35:38]):
    print x[7:10]

这怎么可能是他想要的?他的数据列是固定宽度的,第五列有一些条目都是空白的。对他的数据使用str.split会造成混乱。他粗体的一栏是关于第九栏的——我看不出你从哪里得到3个连续的栏。对,我没有注意到。谢谢我应该用切片的+我还提到我还没有完全理解这个问题。这怎么可能是他想要的呢?他的数据列是固定宽度的,第五列有一些条目都是空白的。对他的数据使用str.split会造成混乱。他粗体的一栏是关于第九栏的——我看不出你从哪里得到3个连续的栏。对,我没有注意到。谢谢我应该用切片的+我还提到我还没有完全理解这个问题。