2015-12-04 67 views
0

我想根据用户输入划分一个列表。 例如,我可以得到在python中获取列表中的最后几个元素

(["A","B","C","D"],num_of_groups) 
>>>["AB","BC","CD","DA"] 

我的问题的列表是最后一个元素。因为就像在这个例子中,我需要把列表中的最后一个和第一个元素(也可以是最后两个和前三个)..

我试图通过添加所有元素两次,然后切片,但然后我有一个问题,当用户想要一组所有元素时,我将返回两组元素,而不仅仅是一组元素。我将解释:

这是我在做什么

list_copy = list(char_list)*2 
#get the slice in the size of n. 
slices.append(list_copy[i:i+n]) 

这是当用户eners大小相同列表大小

(["A","B","C"],3) 

>>>["ABC","ACB","BAC","BCA","CAB","CBA","ABC","ACB","BAC","BCA","CAB","CBA"] 
*instead of ["ABC","ACB","BAC","BCA","CAB","CBA"] 

是什么happaning有还有其他方式吗?我会喜欢一些帮助! 谢谢!

+0

所以对于输入'升= [ 'A', 'B', 'C']'和'N = 3',想要'[ 'ABC'] '而不是'['ABC','BCA','CAB']'?从你的例子的第一个例子来看,你似乎想要包装发生。 – Aldehir

+0

我的意思是['ABC','BCA','CAB'] .. –

回答

2

使用模运算符%在必要时从头开始:使用zip强大力量

>>> l = ['a', 'b', 'c', 'd'] 
>>> [l[i%len(l)]+l[(i+1)%len(l)] for i in range(len(l))] 
['ab', 'bc', 'cd', 'da'] 
>>> [l[i%len(l)]+l[(i+1)%len(l)] for i in range(2*len(l))] 
['ab', 'bc', 'cd', 'da', 'ab', 'bc', 'cd', 'da'] 
0

>>> l = ["A","B","C","D"]   
>>> for i in zip(l,l[1:]+l[:1]): print(''.join(i)) 


AB 
BC 
CD 
DA 

这可能是混乱的,但什么是本质上发生的事情是通过迭代2列表,您的原始文件和原始文件的副本,其中每个元素都移过一个。你也可以用这个列表理解:

>>> [''.join(i) for i in zip(l,l[1:]+l[:1])] 
['AB', 'BC', 'CD', 'DA'] 
+0

第二个似乎有'DD'作为最后一个元素而不是'DA'。看起来像一个'-1'而不是'1'的切片。 – TigerhawkT3

+0

我的不好,没有仔细检查列表理解:P –

0

这是为你想达到什么样的一个小暧昧。在你的第一个例子中,你环绕得到DA,然而在你的最后一个例子中,你只想要['ABC']而不是执行相同的包装来得到['ABC', 'BCA', 'CAB']

如果你希望得到的包装效果,那么这里的东西,你可以这样做:

from itertools import islice, cycle 

def group(l, size): 
    return [ ''.join(islice(cycle(l), i, i + size)) for i in xrange(len(l)) ] 

使用itertools.cycle有点一倍列表更方便。由于您正在使用迭代器而不是列表,因此您必须将其与itertools.islice配对才能进行切片。

这里的示例输出:

>>> group(['A', 'B', 'C', 'D'], 2) 
['AB', 'BC', 'CD', 'DA'] 

>>> group(['A', 'B', 'C'], 1) 
['A', 'B', 'C'] 

>>> group(['A', 'B', 'C'], 2) 
['AB', 'BC', 'CA'] 

>>> group(['A', 'B', 'C'], 3) 
['ABC', 'BCA', 'CAB'] 

>>> group(['A', 'B', 'C'], 4) 
['ABCA', 'BCAB', 'CABC'] 
相关问题