1
origCodon = ([orig[i: i + groupSize] for i in range(len(orig) + 1 - groupSize)])
patCodon = ([pat[i: i + groupSize] for i in range(len(pat) + 1 - groupSize)])
print (patCodon)
origCode = []
patCode = []
for p in patCodon:
    for d in dna:
         if d == p:
              x = dna[p]
              print (p)
              patCode.append(x)

上面的代码需要两个列表并将它们分成三个一组,但是当我检查每个单独的元素时,它会创建一个新的三个列表,每次都沿着一个元素移动。

即这是一份清单:

['AAC', 'ACT', 'CTG', 'TGC', 'GCA', 'CAG', 'AGC', 'GCT', 'CTC', 'TCA']

但这些是它检查的元素:

AAC
ACT
CTG
TGC
GCA
CAG
AGC
GCT
CTC
TCA

我如何才能检查每组三个,然后移动到下一个?

我的列表分为三组(成为列表中的项目),我想检查每个项目的对应氨基酸(在字典中),但程序不断制作新列表,例如用户输入 AAATTT,然后程序检查:

AAA
AAT
ATT
TTT

而不仅仅是AAA和TTT

4

3 回答 3

5

有两种方法可以做到这一点:切片或共享迭代器。

其他答案显示了 slice 方法-如果您只知道/记住 step=3 到,我认为您可能已经正确了range

[lst[i:i+3] for i in range(0, len(lst), 3)]

这种方法唯一的主要缺点是它只适用于列表或其他序列,而不是一般的可迭代对象。在您当前的代码中,这无关紧要,因为您要调用它的一个列表。

但也值得知道另一种选择:

i = iter(list)
zip(i, i, i)

iter只是向序列或其他可迭代对象询问其内容的单遍迭代器。

然后zip像往常一样,步调一致地推进它们。

因为所有三个zip参数都是对完全相同的迭代器的引用,所以当它试图推进一个时,它会推进所有的迭代器。(这就是为什么我们不能这样做zip(iter(i), iter(i), iter(i))——那么你将拥有三个独立的迭代器。)


但是,如果您想按 2 或 5 分组怎么办?zip(i, i)为等编写单独的函数zip(i, i, i, i, i)不是很好。

n如果我们有一个迭代器的引用序列,我们可以使用*args语法,如教程解包参数列表中所述,只调用zip(*sequence).

*我们可以很容易地通过使用重复运算符:得到这样的序列[i]*n。(如果您不明白为什么最终会n引用一个迭代器,而不是n单独的迭代器,请阅读 Python 常见问题解答中关于如何创建多维列表?的条目。)

您可以将所有这些组合成一条线:

zip(*[iter(lst)]*n)

如果剩下部分组,这将删除它,因为这就是这样zip做的。因此,如果您希望在这种情况下做一些不同的事情,您可以zip用不同的函数替换 - 例如,用空格填充部分组,只需:

itertools.zip_longest(*[iter(lst)]*3, fillvalue=' ')

文档中的itertools食谱有一个函数调用者grouper为您执行此操作。

于 2013-08-30T21:09:23.710 回答
3

向解决了大部分问题的 Óscar 点点头,我认为 OP 是在问这样的问题:

codon = 'AACTGCAGCTCA'

list = [codon[i:i+3] for i in range(0, len(codon), 3)]

=> ['AAC', 'TGC', 'AGC', 'TCA']

该列表['AAC', 'ACT', 'CTG', 'TGC', 'GCA', 'CAG', 'AGC', 'GCT', 'CTC', 'TCA']是 OP 代码的意外结果,因为每个三元组都包含前一个字符的最后两个字符。

编辑:另外,这段代码:

for p in patCodon:
    for d in dna:
        if d == p:
             x = dna[p]
             print (p)
             patCode.append(x)

应该是这样的:

for p in patCodon:
    if p in dna:
        x = dna[p]
        print (p)
        patCode.append(p)

原因是检查成员资格in比遍历成员要快得多。

这只有在dna是一个字典时才有效。如果dna是一个列表,同样的语法也可以用来检查是否p是 in dna,但x = dna[p]可能是一个错误。

于 2013-08-30T20:56:33.350 回答
1

你的意思是,像这样?

lst = ['AAC', 'ACT', 'CTG', 'TGC', 'GCA', 'CAG', 'AGC', 'GCT', 'CTC', 'TCA']
[lst[i:i+3] for i in range(0, len(lst), 3)]

=> [['AAC', 'ACT', 'CTG'], ['TGC', 'GCA', 'CAG'], ['AGC', 'GCT', 'CTC'], ['TCA']]

以上将遍历原始列表并创建最多三个元素的子列表 - 请注意最后一个子列表可以有 1、2 或 3 个元素。

于 2013-08-30T20:50:56.497 回答