python迭代列表和子字符串

2024-06-02 04:49:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个python字典变量。一种是以id作为键,以长字符串作为值的dict,另一种是以不同类型的id作为键并以list作为值的dict。在

它们看起来像这样:

**dContigData** 
Chromosome_8.8 AAACGCAATAACCAGAAAACCAATTTTTAAAATATTAAACCCAACGAAAT...
Chromosome_8.4 CCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCC...
Chromosome_8.5 CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCT...
Chromosome_8.6 GCCTGCTCGTAACCCTGACTCGTCCACCCCCAATCCGTCACCCCATTAAT...
Chromosome_8.7 CCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACC...
Chromosome_8.1 TCGCTTCGGCGGTCCTGCGGCATCTTTGTACTTCTTGTGGAAGTCGTCAA...
Chromosome_8.2 CCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACC...
Chromosome_8.3 TAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTA...

另一个:

^{pr2}$

因此,我编写了代码,将“dict e”中的键和“dict e”值[1]-1(第一种情况是306311,因为python的位置而减去1)中的dContigData value的子字符串打印到值[-1](第一种情况下是307475)。但是,虽然位置信息元素(列表中第一个元素之后的元素)的长度不同。e、 染色体(8.X)总是成对的。实际上,我要做的是迭代每个列表中的位置信息元素,并将dContigData的字符串作为子字符串。在

我的代码:

dContigData = readContigFasta()

#for key in dContigData:
#    print(key, dContigData[key][0:50]+"...")

for key in e:
    for contigID in dContigData:
        if e[key][0] == contigID:
            #print (key, e[key])
            print (key, dContigData[contigID][e[key][1]-1:e[key][-1]]) # -1 for start base 0

编辑:好吧,你们中的很多人都听不懂我的问题,所以如果你不明白上面的含糊不清,请集中精力看下面的最终结果。;)

结果应该是(例如“dict e”中的第5个,有3个片段):

例如

MGG_00992T0 [896032]ATGGGCATTTCGGCTCGGGTCAGTAC[896144]...[896225]GCTGACCCATTACAGGTTGGGGGCTTTAA[896573]...[896654]ACCAAAGTTCCCACTTGTCCCCTGGGACCGAGATGTCCAACAATGA[897307]

[数字]还有。。。为了更容易理解(不包括在内)

有没有办法在循环时把一个字符串子串起来,然后连接回一个字符串?在


Tags: key字符串代码in信息id元素for
3条回答

这是你问题的简化版本,说明我 根据编辑前的问题思考并使用 完整的字母表而不是DNA,以使位置更清晰。(请参阅 有关如何编写有用的minimal example的帮助文件。)

dContigData = {
    "chromo_1": "abcdefghij",
    "chromo_2": "ABCDEFGHIJ"
}

e = {
    "mgg_1": ["chromo_1", 2, 4, 7, 9],
    "mgg_2": ["chromo_2", 1, 5, 8, 10]
}

期望输出:

^{pr2}$

如果这就是您的意思,那么python3代码将生成该输出。 请注意,字典键不是按任何特定顺序排列的。你可能更喜欢 为e使用列表列表,而不是列表字典,因为 不管怎样,你似乎只是在重复它。在

for mgg in sorted(e):
    lst = e[mgg]
    chrom = lst[0]
    substrings = []
    for i in range(1, len(lst), 2):
        startpos, endpos = lst[i:i+2]
        substrings.append(dContigData[chrom][startpos-1:endpos])
    print("{}\n{}".format(mgg, "".join(substrings)))

如果我没弄错你的问题,这应该可以做到:

for key, value in e.items():
    print(
        key,
        dContigData[value[0]][value[1]-1:value[-1]]
    )

更普遍的解决方案:

import itertools


def group(lst, n):
    """Group an iterable into an n-tuples iterable. Incomplete tuples
    are discarded e.g.

    >>> list(group(range(10), 2))
    [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]
    >>> list(group(range(10), 3))
    [(0, 1, 2), (3, 4, 5), (6, 7, 8)]
    """
    return itertools.izip(*[itertools.islice(lst, i, None, n)
                          for i in range(n)])


for key in e:
    sub_str_list = []
    contigID = e[key][0]
    for start, end in group(e[key][1:], 2):
        sub_str_list.append(dContigData[contigID][start-1:end])
    print(contigID, '...'.join(sub_str_list))

相关问题 更多 >