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