2016-07-07 61 views
2

我有一个像['a','b','c','d','e','f','g','h' 'i','j','k']如何重新排序Python列表中的每N个项目

如何根据每n件物品(例如每4件物品)对其进行重新排序,使其具有第1件,第5件,第9件,第2项,第6项,第10项,第3项,第7项,第11项,第4项,第8项,第12项。 (是的,我用于开始通过1而不是0以书面出计数抱歉....)

[ '一个', 'E', 'I', 'B', 'F', 'J', 'C', 'G', 'K']

回答

5

更新

马克托罗宁是正确的,原来的解决方案只适用于少数情况。这里是一个修正版本:

>>> flatten = lambda x: reduce(lambda a,b: a+b, x) 
>>> everyN = lambda N,l: flatten([l[s:][::N] for s in range(N)]) 

注:flatten可以many ways实现(包括itertools.chain.from_iterable)。

用法示例:

>>> everyN(4, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']) 
['a', 'e', 'i', 'b', 'f', 'j', 'c', 'g', 'k', 'd', 'h'] 

>>> everyN(4, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']) 
['a', 'e', 'i', 'b', 'f', 'j', 'c', 'g', 'k', 'd', 'h', 'l'] 

>>> everyN(2, ['a','b','c']) 
['a', 'c', 'b'] 

原液

>>> import itertools 
>>> l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] 
>>> step = 4 
>>> list(itertools.islice(l*step, None, None, step)) 
['a', 'e', 'i', 'b', 'f', 'j', 'c', 'g', 'k', 'd', 'h'] 

注意,list()调用通常不是因为这需要一个名单也将采取迭代器对象最需要的东西。但是显示结果很方便。

+0

这只适用于因为列表是小于4的倍数的一个。添加另一个项目或更改步骤,它会中断。 –

+0

@MarkTolonen真够的。我更新了一个更好的解决方案。 – kanaka

2

我怀疑这是最高效的或完美的解决方案,但它的工作:

>>>lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] 
>>>lst[::4] + lst[1::4] + lst[2::4] + lst[3::4] 
['a', 'e', 'i', 'b', 'f', 'j', 'c', 'g', 'k', 'd', 'h'] 
+0

如果你有一千个加数? –

1

你可以这样做:

l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] 
    f = [] 
    n = 4 

    for i in range(n): 
     f.extend(l[i::n]) 
1

这支持与任何n步任意长度列表:

from itertools import islice 

def reorder(L,N): 
    return [x for n in range(N) for x in islice(L,n,None,N)] 

L = list(range(16)) 
for N in range(1,9): 
    print(N,reorder(L,N)) 

L = list('abcdefghijk') 
for N in range(1,9): 
    print(N,reorder(L,N)) 

输出:

1 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 
2 [0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15] 
3 [0, 3, 6, 9, 12, 15, 1, 4, 7, 10, 13, 2, 5, 8, 11, 14] 
4 [0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15] 
5 [0, 5, 10, 15, 1, 6, 11, 2, 7, 12, 3, 8, 13, 4, 9, 14] 
6 [0, 6, 12, 1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10, 5, 11] 
7 [0, 7, 14, 1, 8, 15, 2, 9, 3, 10, 4, 11, 5, 12, 6, 13] 
8 [0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15] 
1 ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] 
2 ['a', 'c', 'e', 'g', 'i', 'k', 'b', 'd', 'f', 'h', 'j'] 
3 ['a', 'd', 'g', 'j', 'b', 'e', 'h', 'k', 'c', 'f', 'i'] 
4 ['a', 'e', 'i', 'b', 'f', 'j', 'c', 'g', 'k', 'd', 'h'] 
5 ['a', 'f', 'k', 'b', 'g', 'c', 'h', 'd', 'i', 'e', 'j'] 
6 ['a', 'g', 'b', 'h', 'c', 'i', 'd', 'j', 'e', 'k', 'f'] 
7 ['a', 'h', 'b', 'i', 'c', 'j', 'd', 'k', 'e', 'f', 'g'] 
8 ['a', 'i', 'b', 'j', 'c', 'k', 'd', 'e', 'f', 'g', 'h'] 
1

你可以用一个简单的做-liner:

lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] 
every4 = [s for i in range(4) for s in lst[i::4]] 

这是James Moriarty解决方案的简单重写。

相关问题