Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,如何访问3人一组的列表?_Python_List - Fatal编程技术网

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

在python中,如何访问3人一组的列表?,python,list,Python,List,上面的代码获取两个列表并将它们分成三组,但当我检查每个单独的元素时,它会生成一个新的三个列表,每次移动一个元素 i、 e.这是一份清单: 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) origC

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

i、 e.这是一份清单:

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']
如何使每组三个都被检查,然后转到下一组

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

AAC
ACT
CTG
TGC
GCA
CAG
AGC
GCT
CTC
TCA
而不仅仅是AAA和TTT,你是说,像这样

AAA
AAT
ATT
TTT

以上内容将迭代原始列表,并创建最多包含三个元素的子列表-请注意,最后一个子列表可以包含1、2或3个元素。

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

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']]
列表['AAC','ACT','CTG','TGC','GCA','CAG','AGC','GCT','CTC','TCA']是OP代码的意外结果,因为每个三元组包含前一个的最后两个字符

编辑:另外,这段代码:

codon = 'AACTGCAGCTCA'

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

=> ['AAC', 'TGC', 'AGC', 'TCA']
应该是这样的:

for p in patCodon:
    for d in dna:
        if d == p:
             x = dna[p]
             print (p)
             patCode.append(x)
原因是使用in检查成员身份比在成员上循环快得多


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

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

其他答案显示了切片方法,我认为如果您知道/记住步骤=3到范围,您可能会得到正确的结果:

此方法唯一的主要缺点是,它只适用于列表或其他序列,而不是一般的iterable。在您当前的代码中,这并不重要,因为您想要调用它的是一个列表

但另一种选择也值得了解:

[lst[i:i+3] for i in range(0, len(lst), 3)]
只要求序列或其他iterable在其内容上使用单遍迭代器

然后,像往常一样,紧跟着他们前进

因为zip的所有三个参数都引用了完全相同的迭代器,所以当它尝试推进一个迭代器时,它会推进所有迭代器。这就是为什么我们不能只做zipiteri,iteri,iteri,然后你会有三个独立的迭代器

但是如果你想按2或5分组呢?为zipi、i和zipi、i、i、i、i等编写单独的函数不是很好

如果我们有一个迭代器的n个引用序列,我们可以使用*args语法,如下面的教程所述,只调用zip*序列

通过使用[i]*n,我们可以很容易地得到这样一个序列。如果您不明白为什么最终会有n个对一个迭代器的引用,而不是n个单独的迭代器,请阅读上的Python常见问题解答条目

您可以将所有这些放在一行中:

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

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

文档中的有一个函数调用程序grouper,它可以为您实现这一点。

我对您的目标很困惑。检查是什么意思?dna是一本词典吗?昨天有人发布了一个非常类似的问题。@Josay:每隔几天就有人问一个类似的问题。我不确定这是一个数百个问题的重复,但我想是的…我在哪里可以找到关于zip*[iterlst]*3中使用的语法的文档?不清楚星号的作用,也不确定在哪里可以找到解释。@MarkR.Wilkins:重新组织答案并添加链接,以帮助您找到解释。
zip(*[iter(lst)]*n)
itertools.zip_longest(*[iter(lst)]*3, fillvalue=' ')