Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.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 - Fatal编程技术网

Python 基于列删除连续的重复行

Python 基于列删除连续的重复行,python,Python,我正在努力解决一个问题,下面将对此进行解释。我也分享了不完整的python脚本,它不能解决这个问题。如果我的剧本能得到支持或指导,我将不胜感激 我的制表符分隔文件如下所示: + 5 1364182 TTGC - 5 1364204 GATG + 1 9372980 TTCA - 1 9373028 GGAA + 2 14029383 ACCA - 2 14029437 ACCA - 1

我正在努力解决一个问题,下面将对此进行解释。我也分享了不完整的python脚本,它不能解决这个问题。如果我的剧本能得到支持或指导,我将不胜感激

我的制表符分隔文件如下所示:

+   5     1364182    TTGC
-   5     1364204    GATG
+   1     9372980    TTCA
-   1     9373028    GGAA
+   2     14029383   ACCA
-   2     14029437   ACCA
-   1     19815169   AGTT
-   1     19815254   CCGT
+   4     13475195   AGCA
-   4     13475251   TCTC
-   5     64182      TTGC
-   5     64204      GATG
+   1     9372980    TTCA
-   1     9373028    GGAA
+   2     14029383   ACCA
-   2     14029586   ACCT
我试图在第一列(即+和-)的基础上删除除第一个匹配之外的所有行。输出应该如下所示:

+   5     1364182    TTGC
-   5     1364204    GATG
+   1     9372980    TTCA
-   1     9373028    GGAA
+   2     14029383   ACCA
-   2     14029437   ACCA
+   4     13475195   AGCA
-   4     13475251   TCTC
+   1     9372980    TTCA
-   1     9373028    GGAA
+   2     14029383   ACCA
-   2     14029586   ACCT
脚本:

#!/usr/bin/python

gff = raw_input("Enter the gff file: ")
gff_file = open(gff, "r")
f1 = open("f1", "w")

for line in gff_file:
        line = line.rstrip()
        line = line.split("\t")
        x = line[0]
        for line1 in gff_file:
                line1 = line1.rstrip()
                line1 = line1.split("\t")
                y = next(line1[0])
                if x != y:
                        f1.write(x + line1[0]+"\n")
我无法将第一列条目与连续的同一列条目进行比较。
文件非常大,因此一行程序无法工作。

如果这不是编程练习,您只想清理数据,请切换到
awk
。它甚至不是一个班轮

$ awk 'p!=$1{p=$1; print}' file

+   5     1364182    TTGC
-   5     1364204    GATG
+   1     9372980    TTCA
-   1     9373028    GGAA
+   2     14029383   ACCA
-   2     14029437   ACCA
+   4     13475195   AGCA
-   4     13475251   TCTC
+   1     9372980    TTCA
-   1     9373028    GGAA
+   2     14029383   ACCA

如果这不是编程练习,而您只想清理数据,请切换到
awk
。它甚至不是一个班轮

$ awk 'p!=$1{p=$1; print}' file

+   5     1364182    TTGC
-   5     1364204    GATG
+   1     9372980    TTCA
-   1     9373028    GGAA
+   2     14029383   ACCA
-   2     14029437   ACCA
+   4     13475195   AGCA
-   4     13475251   TCTC
+   1     9372980    TTCA
-   1     9373028    GGAA
+   2     14029383   ACCA

如果我理解正确的话,您基本上是按照第一个符号(
+
-
)的集群进行分组,并且您只希望保留第一个符号。这是一个很好的用例:

groupby
接受一个iterable(这里是中的输入文件
fp_)和一个键函数,我将其传递为
lambda x:x.split(“\t”)[0]
,意思是“取行,按制表符拆分,并给我第一个元素”


它产生一对包含一个键(这里是
+
-
)和一个遍历组中所有元素的迭代器——在本例中,是以相同符号开头的连续行组。我们用
next(group)
选择第一个并写出它

如果我理解正确,您基本上是按照第一个符号的集群进行分组(
+
-
),您只想保留第一个符号。这是一个很好的用例:

groupby
接受一个iterable(这里是
中的输入文件
fp_)和一个键函数,我将其传递为
lambda x:x.split(“\t”)[0]
,意思是“取行,按制表符拆分,并给我第一个元素”


它产生一对包含一个键(这里是
+
-
)和一个遍历组中所有元素的迭代器——在本例中,是以相同符号开头的连续行组。我们用
next(group)
选择第一个并写出它

这应该可以做到:

consec_lines = False
x = None
for line in gff_file:
    line = line.rstrip()
    line = line.split("\t")
    if line[0] == x:
        consec_lines = True
        continue
    x = line[0]
    consec_lines = False
    for i in line+"\n":
        f1.write(i)

这应该可以做到:

consec_lines = False
x = None
for line in gff_file:
    line = line.rstrip()
    line = line.split("\t")
    if line[0] == x:
        consec_lines = True
        continue
    x = line[0]
    consec_lines = False
    for i in line+"\n":
        f1.write(i)

你能详细说明一下吗!你的例子不容易理解!你想用
y=next(第1[0]行]
实现什么?你为什么要删除
-1 19815169 AGTT
?实际上他正在删除
-1 19815169 AGTT
-1 19815254 CCGT
@Dataman我已经编辑了这个例子,请看一看,你能详细说明一下吗!你的例子不容易理解!你想用
y=next(第1[0]行]
实现什么?你为什么要删除
-1 19815169 AGTT
?实际上他正在删除
-1 19815169 AGTT
-1 19815254 CCGT
@Dataman我已经编辑了示例,请看一看