python - 如何根据特定字符在所述列表的第一个成员中出现的位置从列表中的每个字符串中删除一个字符?
问题描述
所以我有一个字符串列表,长度相同,如下所示:
list_strings=["A-C-TG--","ATCGTAGC","ATGCGATC","ATGCGGTC"]
我要做的是,对于第一个成员list_strings
有“-”的每个位置,从list_strings
.
我的输出将是这样的:
new_list_strings=["ACTG","ACTA","AGGA","AGGG"]
我试过这样做:
- 创建一个空的新列表。
- 获取第一个成员
list_strings
有“-”的位置。 - 从所有字符串中删除间隙并将新字符串附加到“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)
不幸的是,这只是删除其中一个位置,而不是全部位置。有人知道我在做什么错吗?
解决方案
解决方案使用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)
推荐阅读
- javascript - $ 无法在 Javascript/jQuery 代码中识别 - 尝试使用类名 =“jeff”为模块设置动画
- java - Java TreeMap 有两个键并且可以使用单个键?
- python - Micropython - 如何在后台接收数据
- ffmpeg - ffmpeg 使用调色板将 mp4 转换为 gif 会导致视频被截断
- r - 将日期添加到非日期数字变量?
- python - 如何使用 python 行继续在 tkinter 上的文本中删除不需要的选项卡
- excel - 如何将动态范围与移动的“总”单元格相加?
- javascript - 通过 javascript 调整网络摄像头(用户媒体)摄像头设置
- ruby-on-rails - Rails:使用 Apartment 和 MySQL 的多租户
- eclipse - 安装在 scalaIDE(eclipse) 上的 testng 插件在系统重启后消失