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

2024-04-16 07:57:38 发布

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

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)

上面的代码获取两个列表,并将它们分成三个一组,但是当我检查每个单独的元素时,它会生成一个新的列表,其中有三个,每次沿着一个元素移动。在

也就是说,这是一份清单:

^{pr2}$

但这些是它检查的元素:

AAC
ACT
CTG
TGC
GCA
CAG
AGC
GCT
CTC
TCA

我怎样才能使每三组都被检查,然后再转到下一组呢?在

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

AAA
AAT
ATT
TTT

而不仅仅是TTAAA


Tags: 项目in程序元素列表forlenrange
3条回答

你是说,像这样?在

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

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

其他答案显示了slice方法,如果您知道/记住了步骤=3到range,您本可以得到正确的方法:

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

这种方法的唯一主要缺点是它只对列表或其他序列有效,而不是一般的iterable。在您当前的代码中,这并不重要,因为您要在上调用它的对象是一个列表。在

但也有必要知道另一种选择:

^{pr2}$

^{}只要求序列或其他iterable对其内容进行单次迭代。在

然后^{}像往常一样步调一致地推进它们。在

因为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引用,而不是{}单独的迭代器,请阅读Python关于How do I create a multidimensional list?的常见问题解答条目。)

你可以把这一切放在一条直线上:

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

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

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

文档中的^{} recipes有一个函数调用者grouper,它为您完成这项工作。在

我向Ó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代码的意外结果,因为每个三元组都包含前一个三元组的最后两个字符。在

编辑:同样,这段代码:

^{pr2}$

应该是这样的:

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

原因是使用in检查成员身份要比循环遍历成员快得多。在

这只在dna是dict时有效。如果dna是一个列表,同样的语法将用于检查p是否在{}中,但是{}可能是个错误。在

相关问题 更多 >