在python中,如何将一个数组中的一个元素与另一个数组中的另一个元素进行数值比较

2024-09-30 01:22:22 发布

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

我是python新手,为两个制表符分隔的输入文件创建了两个数组,我正在寻找一种方法,将一个数组的列(element)与另一个数组的元素进行数值比较。有什么办法吗那个。我的代码如下

#!/usr/bin/python
import sys
from array import *
#print len(sys.argv)
if len(sys.argv) != 4:
 print 'Usage: python scores.py <infile1> <infile2> <outfile>'
 sys.exit(1)

f1 = open ("12877overlappedallvariants.gvf", "r")
f2 = open ("unmatched.12877overlappedallvariants.gvf", "r")
f3 = open ("out.txt", "w")

for line in f1.readlines():
 cols = line.split('\t')
 #print cols[5:6]


for line in f2.readlines():
 cols1 = line.split('\t')
 #print cols1[5:6]

我尝试了下面的代码部分,但不起作用

^{2}$

我正在尝试查看array1的元素5是否等于、大于或小于array2的元素5。感谢任何帮助。谢谢。在


Tags: 代码inimport元素forlensysline
3条回答

首先需要注意的是,在读取文件之后,只存储最后一行(在一个名为“cols”的变量中;)。像这样的循环:

lines1=f1.readlines()
lines2=f2.readlines()

for f1line,f2line in zip(lines1,lines2):
    #compare here

可能更合适。这将把两个文件的全部内容读入内存中当然也有一些方法不需要同时读取那么多数据,但有时这是最简单的。zip可能有点混乱,但基本上,它将file1的第一行与file2的第一行匹配,然后将两个文件的第二行匹配,依此类推。。。在

如@Lattyware在评论中所述,上述内容相当于:

^{pr2}$

因为文件可以被迭代。在Python2中,它仍然会同时读取/存储这两个文件,但在Python3中,每次只能从每个文件中生成一行。最后,如果不想在python2中存储文件的所有内容,可以使用itertools.izip

import itertools
for f1line,f2line in itertools.izip(f1,f2):
    #compare here    

它的工作原理与zip相似,只是每次只生成一个元素。这里的缺点是,itertools.izip在移到python3时消失了……但是,在本例中,2to3应该进行适当的转换。(更多信息请参见评论)。在

至于比较,这在很大程度上取决于文件包含的内容。如果它包含数字,你可以这样做。。。在

 for f1line,f2line in zip(lines1,lines2):
     row1=map(float,f1line.split())
     row2=map(float,f2line.split())
     #compare the 5th element
     if(row1[4]==row2[4]):
         #equal
     elif(row1[4]>row2[4]):
         ... 

如果没有map(float,...)位,python将进行字符串比较。在

python还有一个cmp function,如果您想现在比较并在以后使用比较的结果,这可能会很有用。在

值得注意的是,这些是列表,而不是数组。这是有区别的。在

每次循环时都会重写cols这意味着您只会得到最后一行数据-列表理解是为了得到您想要的所有数据,或者更好的是,根本不存储数据-对它执行您想要的操作。在

比较时的主要问题是,您正在获取列表切片,而不仅仅是获取所需的元素。这太复杂了。在

因此,正如我在评论中提到的,您可以对初始代码进行许多改进,主要是with语句和csv模块。在

因此,首先,使用with语句打开文件。我们也使用csv.reader(),使用"excel-tab"方言作为制表符分隔的文件,csv.QUOTE_NONNUMERIC告诉它值是数字,所以以后不必从字符串转换它们。请注意,如果只有某些值是数字,则需要引用所有非数字值才能使用此方法,或者显式转换这些值而不使用它。在

with open("file1.tsv") as file1, open("file2.tsv") as file2:
    rows = csv.reader(file2, dialect="excel-tab", quoting=csv.QUOTE_NONNUMERIC)
    rows1 = csv.reader(file2, dialect="excel-tab", quoting=csv.QUOTE_NONNUMERIC)

要执行检查,只需执行如下操作(在上面的with块中继续):

^{pr2}$

注意使用zip可以同时循环两个文件。我们需要在文件每次返回一行时对其进行循环,每行是每列的数据列表。然后您可以随意处理数据。我已经给出了一个比较第五个值的例子(注意索引4-python是0索引的——也就是说,第一个值是0,所以第五个值是4)。在

通过在文件循环过程中执行这些操作,我们可以确保不必创建列表并临时存储数据—如果我们最终处理的是大文件,这一点很有用。在

如果您以后需要大量使用该数据,并且希望它作为一个列表,那么您可以简单地将两个rows对象列表,方法是在csv.reader()周围包装一个list()调用

我会这样写:

import csv

file1 = csv.reader(open('name1'), delimiter='\t')
file2 = csv.reader(open('name2'), delimiter='\t')

for row1, row2 in zip(file1, file2):
    print cmp(row1[5], row2[5])

`

cmp返回-1表示lt,0表示eq,或1表示gt

如果行?[5] 是数字,则…

^{pr2}$

相关问题 更多 >

    热门问题