在Python中的字符串匹配实例之间向键添加值

时间:2015-12-16 21:51:46

标签: python dictionary

我正在尝试制作一个字典,其中每个键都是(一个独特的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')

1 个答案:

答案 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]将返回没有换行符的字符串,您可以删除空格。