【问题标题】:How to append characters to a string being used as a python dictionary key (when there are multiple entries related to that string)?如何将字符附加到用作python字典键的字符串(当有多个与该字符串相关的条目时)?
【发布时间】:2016-08-26 10:27:22
【问题描述】:

我正在从 HMMER 生成的输出文件中提取序列坐标(在基因组组装文件中查找 DNA 序列,匹配查询)。

我创建了一个 python 字典,其中键是源序列名称(字符串),值是包含目标序列的开始和结束坐标的列表。但是,HMMER 通常会在单个源序列(重叠群/染色体)上找到多个匹配项。

这意味着当我添加到字典中时,如果我在一个 contig 上遇到多个匹配项,每个匹配项都会被以下匹配项覆盖。

例如HMMER 找到以下匹配项:

名称开始结束

4415 16723 17556

127 1290 1145

1263 34900 37834

4415 2073 3899

4415 4580 6004

但这会产生以下字典(我希望每个匹配项都有单独的条目):

{'127': ['1290', '1145'], '1263': ['34900', '37834'], '4415': ['4580', '6004']}

如何在键上附加一个字母,以便后续匹配是唯一的,并且不会覆盖之前的匹配,即 4415、4415a、4415b 等?

matches = {}

for each line of HMMER file:
    split the line
    make a list of fields 4 & 5 (the coordinates)
    # at this stage I need a way of checking whether the key (sequenceName)
    # is already in the dictionary (easy), and if it is, appending a letter
    # to sequenceName to make it unique
    matches[sequenceName] = list

【问题讨论】:

  • 如果我不在 iPhone 应用程序上,我的答案是使用名称属性创建一个自定义类,然后使用拆分字符串创建一个实例列表。您使用 dict 而不是 numpy 数组是否有特定原因?

标签: python dictionary key unique


【解决方案1】:

当它们相等时创建不同的键不是正确的方法,相反,您可以使用列表作为值并保留其中的坐标,用于重复键。您可以为此目的使用collections.defaultdict()

>>> coords = [['4415', '16723', '17556'], ['127', '1290', '1145'], ['1263', '34900', '37834'], ['4415', '2073', '3899'], ['4415', '4580', '6004']]
>>> from collections import defaultdict
>>> 
>>> d = defaultdict(list)
>>> 
>>> for i, j, k in coords:
...     d[i].append((j, k))
... 
>>> d
defaultdict(<type 'list'>, {'1263': [('34900', '37834')], '4415': [('16723', '17556'), ('2073', '3899'), ('4580', '6004')], '127': [('1290', '1145')]})

此外,在键的末尾添加一个字符的想法不是最佳的,因为您需要始终计算键的数量并且您不知道这个数字,因此您必须生成新的后缀。

但作为替代方案,如果您只使用键的计数,您可以通过将键保留在 Counter() 对象中并在键的尾部添加计数来创建不同的键:

>>> from collections import Counter
>>> d = {}
>>> c = Counter()
>>> for i, j, k in coords:
...     c.update((i,))
...     d["{}_{}".format(i, c[i])] = (j, k)
... 
>>> d
{'4415_1': ('16723', '17556'), '4415_3': ('4580', '6004'), '4415_2': ('2073', '3899'), '127_1': ('1290', '1145'), '1263_1': ('34900', '37834')}

【讨论】:

    【解决方案2】:

    你可以这样做:

    matches = {'127': ['1290', '1145'], '1263': ['34900', '37834'], '4415': ['4580', '6004']}
    
    # sample key_name
    key_name = '4415'
    if key_name in matches.keys():
        for i in xrange(1,26):
            if key_name+chr(ord('a') + i) not in matches.keys():
                    matches[key_name+chr(ord('a') + i)] = #your value
    

    这会将您的 key_names 递增为 4415a、4415b...

    【讨论】:

      猜你喜欢
      • 2014-07-05
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 2018-07-18
      • 1970-01-01
      • 2020-09-20
      相关资源
      最近更新 更多