如何在python中访问3组中的列表?

时间:2013-08-30 20:45:03

标签: python list

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

3 个答案:

答案 0 :(得分: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是dict时才会有效。如果dna是一个列表,则相同的语法将用于检查p是否在dna中,但x = dna[p]可能是错误的。

答案 1 :(得分:3)

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

其他答案显示切片方法 - 如果您只是知道/记住步骤= 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语法(如Unpacking Argument Lists下的教程中所述)来调用zip(*sequence)

我们可以使用* repetition operator[i]*n轻松获得此类序列。 (如果您不理解为什么最终会引用n对一个迭代器的引用,而不是n个单独的迭代器,请阅读How do I create a multidimensional list?上的Python FAQ的条目。)

你可以将所有这些组合成一个单行:

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

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

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

文档中的itertools recipes有一个函数调用者grouper,可以为您执行此操作。

答案 2 :(得分:2)

你的意思是,像这样?

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个元素。