Python:连接包含特定字符串的行

Python:连接包含特定字符串的行,python,join,Python,Join,我想在文件中加入两行,这取决于它们是否以相同的元素开头。 我可以将每行的第一个元素转换为一个列表,并使用列表中的元素搜索每行,但这似乎不是最有效的方法 我有以下文件 1,AF534061.1,T,A 1,K02718.1,T,A 16,AF534061.1,G,- 16,K02718.1,G,- 17,AF534061.1,T,- 17,K02718.1,T,- 18,AF534061.1,A,- 18,K02718.1,A,- 19,AF534061.1,T,-

我想在文件中加入两行,这取决于它们是否以相同的元素开头。
我可以将每行的第一个元素转换为一个列表,并使用列表中的元素搜索每行,但这似乎不是最有效的方法

我有以下文件

1,AF534061.1,T,A  
1,K02718.1,T,A  
16,AF534061.1,G,-  
16,K02718.1,G,-  
17,AF534061.1,T,-  
17,K02718.1,T,-  
18,AF534061.1,A,-  
18,K02718.1,A,-  
19,AF534061.1,T,-  
19,K02718.1,T,-  
20,AF534061.1,A,-  
20,K02718.1,A,-  
21,AF534061.1,A,-   
21,K02718.1,A,-  
24,AF534061.1,C,T   
如果第一项在两行之间共享,我想连接行。所以我想得到以下输出

1,AF534061.1,T,A,1,K02718.1,T,A
16,AF534061.1,G,-,16,K02718.1,G,-
17,AF534061.1,T,-,17,K02718.1,T,-
18,AF534061.1,A,-,18,K02718.1,A,-
19,AF534061.1,T,-,19,K02718.1,T,-
20,AF534061.1,A,-,20,K02718.1,A,-
21,AF534061.1,A,-,21,K02718.1,A,-
24,AF534061.1,C,T
在本例中,看起来我可能只能每隔一行加入一行,但我希望(需要)使代码更通用

我不认为这很难,但我似乎无法理解!
感谢您的帮助

您可以使用正则表达式和反向引用

print re.sub(r'(([^,]+).*)\n(\2.*\n)', r'\1\3', data)
下面是解释的表达式:

(             # Start of first line
 (            # Start of first part of line, refered to as \2
  [^,]+       # Everything before the first comma
 )
 .*           # Remainder of first line
)             # This new line isn't in any capture groups, so it'll be 
\n            #  removed from any matched results
(             # Start of second line
  \2          # This takes the first part of the first line and requires 
              #  it to match again
  .*          # Remainder of second line
  \n          # We include this newline to make the next search start at 
              #  the start of the following line.  It's reinserted because
              #  it's in the second line's capture group.
)

可以使用正则表达式和反向引用

print re.sub(r'(([^,]+).*)\n(\2.*\n)', r'\1\3', data)
下面是解释的表达式:

(             # Start of first line
 (            # Start of first part of line, refered to as \2
  [^,]+       # Everything before the first comma
 )
 .*           # Remainder of first line
)             # This new line isn't in any capture groups, so it'll be 
\n            #  removed from any matched results
(             # Start of second line
  \2          # This takes the first part of the first line and requires 
              #  it to match again
  .*          # Remainder of second line
  \n          # We include this newline to make the next search start at 
              #  the start of the following line.  It's reinserted because
              #  it's in the second line's capture group.
)

我还没有测试过这段代码,但类似的东西应该可以工作:

 common = {}
 for line in file.readLines():
   prefix = line.split(",")[0]
   if prefix in common:
     common[prefix].append(line)
   else:
     common[prefix] = [line]

 for key, values in common:
   print values.join(",")

我还没有测试过这段代码,但类似的东西应该可以工作:

 common = {}
 for line in file.readLines():
   prefix = line.split(",")[0]
   if prefix in common:
     common[prefix].append(line)
   else:
     common[prefix] = [line]

 for key, values in common:
   print values.join(",")

Python标准库中充满了工具。对于此作业,请使用

导入itertools
行='''1,AF534061.1,T,A
1,K02718.1,T,A
16,AF534061.1,G-
16,K02718.1,G-
17,AF534061.1,T-
17,K02718.1,T-
18,AF534061.1,A-
18,K02718.1,A-
19,AF534061.1,T-
19,K02718.1,T-
20,AF534061.1,A-
20,K02718.1,A-
21,AF534061.1,A-
21,K02718.1,A-
24,AF534061.1,C,T''。拆分('\n')
对于键,在itertools.groupby(行,lambda行:行.分区(',')[0])中分组:
打印“,”。加入(组)

Python标准库中充满了工具。对于此作业,请使用

导入itertools
行='''1,AF534061.1,T,A
1,K02718.1,T,A
16,AF534061.1,G-
16,K02718.1,G-
17,AF534061.1,T-
17,K02718.1,T-
18,AF534061.1,A-
18,K02718.1,A-
19,AF534061.1,T-
19,K02718.1,T-
20,AF534061.1,A-
20,K02718.1,A-
21,AF534061.1,A-
21,K02718.1,A-
24,AF534061.1,C,T''。拆分('\n')
对于键,在itertools.groupby(行,lambda行:行.分区(',')[0])中分组:
打印“,”。加入(组)


请参见此处以了解详细信息。这看起来是csv可读的。您应该能够使用python的
csv
模块轻松解析此内容。请参阅此处以了解详细信息。此内容看起来是csv可读的。您应该能够使用python的
csv
模块轻松解析此内容。投票被否决的人能否解释一下?我想改进我的答案。谢谢。我没有否决这个,也没有测试它是否有效,但我猜它被否决是因为人们讨厌它,因为你认为第一件事就是用正则表达式解决所有问题。它会导致非常不清楚的代码,尽管这对知识是有益的,所以如果它有效的话,我当然不会否决它。与
groupby
解决方案相比,它看起来非常难看:D@jamylak基于反对regex的倾向而进行的向下投票将与对答案进行投票的目的背道而驰。正则表达式比
groupby
方法更难看或更不清晰是主观的,也不值得投反对票。@jamylak我理解这一点。我想向任何读到这篇文章的人指出,如果你的任何一个猜测是正确的,那么它们都不是投反对票的正当理由。如果你同意,我们可以删除这些评论。@HonestAbe我同意,是的,尽管没有必要删除这些评论。谁投了反对票,请解释一下?我想改进我的答案。谢谢。我没有否决这个,也没有测试它是否有效,但我猜它被否决是因为人们讨厌它,因为你认为第一件事就是用正则表达式解决所有问题。它会导致非常不清楚的代码,尽管这对知识是有益的,所以如果它有效的话,我当然不会否决它。与
groupby
解决方案相比,它看起来非常难看:D@jamylak基于反对regex的倾向而进行的向下投票将与对答案进行投票的目的背道而驰。正则表达式比
groupby
方法更难看或更不清晰是主观的,也不值得投反对票。@jamylak我理解这一点。我想向任何读到这篇文章的人指出,如果你的任何一个猜测是正确的,那么它们都不是投反对票的正当理由。如果您同意,我们可以删除这些评论。@HonestAbe我同意,是的,尽管没有必要删除这些评论。您可以使用
groupby(csv\u reader,key=itemgetter(0))
csv\u writer.writerow(chain.from\u iterable(group))
@J.F.Sebastian听起来你应该把它作为一个解决方案提交或添加到这里。你可以使用
groupby(csv\u reader,key=itemgetter(0))
csv\u writer.writerow(chain.from\u iterable(group))
@J.F.Sebastian听起来你应该把它作为一个解决方案提交或添加到这里。尽管我被否决了,我做错了什么?我该如何改进我的答案?-1字典没有顺序,所以行可能按正确的顺序输出,也可能不按正确的顺序输出。无需对文件调用
readlines()
,您只需对f中的行进行如下迭代:
(使用
file
作为名称是不好的,因为它会遮挡内置的行)。您可以使用
common.setdefault(前缀,[]).append(行)
,而不是检查字典中的键。另外,您的最后一部分,
对于key,values in common:
,甚至不起作用,因为默认情况下字典会迭代键。对于键、公共值,需要
。items()
以了解我的投票结果,我做错了什么,以及如何改进我的答案?-1字典没有顺序,因此行可能会以正确的顺序输出,也可能不会以正确的顺序输出。无需对文件调用
readlines()
,您只需对f
中的行进行如下迭代:
(使用
file
作为名称是不好的,因为它会遮挡内置的行)。您可以使用
common.setdefault(前缀,[]).append(行)
,而不是检查字典中的键。另外,您的最后一部分,
对于key,values in common:
,甚至不起作用,因为默认情况下字典会迭代键。需要
作为键,值在common.it中