我正在尝试根据用户输入划分列表。 例如,我可以获得
列表(["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"]
有没有其他方法可以这样做?我会喜欢一些帮助! 谢谢!
答案 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']