在python中获取列表中的最后和前几个元素

时间:2015-12-04 23:33:20

标签: 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])

当用户获得与列表大小相同的大小时,这就是满意的

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

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

有没有其他方法可以这样做?我会喜欢一些帮助! 谢谢!

3 个答案:

答案 0 :(得分:2)

在必要时使用模数运算符%从头开始:

>>> 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']

答案 1 :(得分:0)

使用zip的精彩力量:

>>> 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']

答案 2 :(得分: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']