我有一個像['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']
我有一個像['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']
更新:
馬克託羅寧是正確的,原來的解決方案只適用於少數情況。這裏是一個修正版本:
>>> 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()
調用通常不是因爲這需要一個名單也將採取迭代器對象最需要的東西。但是顯示結果很方便。
我懷疑這是最高效的或完美的解決方案,但它的工作:
>>>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']
如果你有一千個加數? –
你可以這樣做:
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])
這支持與任何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']
你可以用一個簡單的做-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解決方案的簡單重寫。
這隻適用於因爲列表是小於4的倍數的一個。添加另一個項目或更改步驟,它會中斷。 –
@MarkTolonen真夠的。我更新了一個更好的解決方案。 – kanaka