首页 > 解决方案 > 如何根据特定字符在所述列表的第一个成员中出现的位置从列表中的每个字符串中删除一个字符?

问题描述

所以我有一个字符串列表,长度相同,如下所示:

list_strings=["A-C-TG--","ATCGTAGC","ATGCGATC","ATGCGGTC"]

我要做的是,对于第一个成员list_strings有“-”的每个位置,从list_strings.

我的输出将是这样的:

new_list_strings=["ACTG","ACTA","AGGA","AGGG"]

我试过这样做:

  1. 创建一个空的新列表。
  2. 获取第一个成员list_strings有“-”的位置。
  3. 从所有字符串中删除间隙并将新字符串附加到“new_list_strings”
list_strings=["A-C-TG--","ATCGTAGC","ATGCGATC","ATGCGGTC"]
new_list_strings=[]
positions=[i for i, letter in enumerate(list_strings[0]) if letter == "-"]
for string in list_strings:
    for i in range(len(string)):
        for pos in positions:
            if i==pos:
                string2=string[:i]+string[i+1:]
                new_list_strings.append(string2)

不幸的是,这只是删除其中一个位置,而不是全部位置。有人知道我在做什么错吗?

标签: pythonstring

解决方案


解决方案使用zip()

>>> shortened = [*zip(*[t for t in zip(*list_strings) if t[0] != "-"])]
>>> shortened
[('A', 'C', 'T', 'G'), ('A', 'C', 'T', 'A'), ('A', 'G', 'G', 'A'), ('A', 'G', 'G', 'G')]
>>>
>>> new_strings = ["".join(t) for t in shortened]
>>> new_strings
['ACTG', 'ACTA', 'AGGA', 'AGGG']

所以,有很多方法可以做到这一点,但这种特殊的方法将基因串压缩在一起并过滤掉以 . 开头的元组"-"。考虑将四个基因串堆叠在一起:zip()获取该堆栈的“列”:

>>> [*zip(*list_strings)]
[('A', 'A', 'A', 'A'), ('-', 'T', 'T', 'T'), ('C', 'C', 'G', 'G'), ('-', 'G', 'C', 'C'), ('T', 'T', 'G', 'G'), ('G', 'A', 'A', 'G'), ('-', 'G', 'T', 'T'), ('-', 'C', 'C', 'C')]

删除以 开头的元组后,"-"元组以另一种方式重新组合在一起(现在考虑获取这些元组并将它们垂直堆叠,然后以与以前相同的方式zip()获取该堆栈的列)。最后,"".join()将字符元组转换为字符串。

“我究竟做错了什么?”

为了回答“我做错了什么?”这个问题,我在您的代码中添加了打印语句。尝试运行它并解释输出:

list_strings=["A-C-TG--","ATCGTAGC","ATGCGATC","ATGCGGTC"]
new_list_strings=[]
positions=[i for i, letter in enumerate(list_strings[0]) if letter == "-"]

for string in list_strings:
    print(f"string: {string}")
    for i in range(len(string)):
        print(f"    i: {i}")
        for pos in positions:
            print(f"        pos: {pos}")
            if i==pos:
                string2=string[:i]+string[i+1:]
                print(f"            match! string2 result: {string2}")
                new_list_strings.append(string2)
    print()

请注意,对于每个string,都会创建多个string2对象。

使用普通简累加器模式的解决方案

准系统累加器模式确实适用于这个问题:

list_strings = ["A-C-TG--","ATCGTAGC","ATGCGATC","ATGCGGTC"]
positions = [i for i, letter in enumerate(list_strings[0]) if letter == "-"]

new_list_strings = []
for string in list_strings:
    new_str = ""
    for idx, char in string:
        if idx not in positions:
            new_str += char
    new_list_strings.append(new_str)

推荐阅读