我正在尝试制作一个字典,其中每个键都是(一个独特的DNA序列)的名称,其值将是其他名称的列表(具有相同的DNA序列)。例如{'2617': [['5632'], ['7630'], ...}
。我正在尝试从具有此结构的文件填充此字典:
1. 11618 [82]
11619
11620
12180
2. 12183 [1]
3. 12918 [2]
12922
我希望该键是以\d+.
开头的行上的第二项,然后值将是\d+.
的下一个实例之前的所有行。在\d+.
匹配的下一个实例之前,我无法确定如何添加这些值
现在,我只有一个独特序列的列表,来自:
unique_seqs=[]
for line in in_file:
line=line.strip()
if '[' in line:
line=line.split()
unique_seqs.append(line[1])
我可以将此列表设为字典值,但我不知道如何从我的文件中同时添加键和值。提前致谢!补充:
这里有一点来自文件:
1. 11618 [82]
11619
11620
12180
ML_S2470
ML_S2472
2. 12183 [1]
12922
3. 12919 [20]
12920
12921
以及在下面最后一条评论中列出我的列表的代码:
in_file = open('example.txt', 'r')
for line in in_file:
line=line.strip()
line=line.split('\n')
答案 0 :(得分:1)
这似乎可以做你想要的。
with open('example.txt', 'r') as in_file:
key = None
sequences = {}
for line in in_file:
if '.' in line:
if key:
sequences[key] = values
key = line.split()[1]
values = []
else:
values.append([line[:-1].strip()])
sequences[key] = values
有效地,您保留一个值列表。如果找到具有键格式的行,则使用其各自的键存储当前值列表,清空列表并将键设置为根据当前读取的行。一旦你不在线,你只需添加你正在处理的最后一个键的值。
最初我们有一个未定义的密钥。由于第一行将是一个键,代码将进入if '.' in line:
块并尝试将任何值映射到我们的键。为了防止这种情况,映射在if key:
块内完成。
我使用了if '.' in line
,因为它保证在字符串中比'['
更早找到。但是,这是一个偏好的问题。
最好使用with
语法打开文件。但即使你以in_file = open(...)
的形式进行,当你遍历这些行时,它们最后会包含一个换行符。但是,您不需要进行任何过早的字符串操作。首先检查线是键还是值。 line.split()[1]
自然会为您挑选关键值,而无需担心删除任何空格或换行符。如果它是一个值,line[:-1]
将返回没有换行符的字符串,您可以删除空格。