Python 如何根据索引模3排列列表元素?
我想根据索引模3排列列表的元素,例如列表:Python 如何根据索引模3排列列表元素?,python,sorting,permutation,Python,Sorting,Permutation,我想根据索引模3排列列表的元素,例如列表: [0,1,2,3,4,5,6,7,8] 应重新排序为: [0,3,6,1,4,7,2,5,8] 总的来说: [A0, A1, A2, A3, A4, A5, A6, A7, A8] 应成为: [A0, A3, A6, A1, A4, A7, A2, A5, A8] 我已尝试使用以下代码: def arr_sort(arr, algo): arrtmp = arr arrlen = len(arr) if algo =
[0,1,2,3,4,5,6,7,8]
应重新排序为:
[0,3,6,1,4,7,2,5,8]
总的来说:
[A0, A1, A2, A3, A4, A5, A6, A7, A8]
应成为:
[A0, A3, A6, A1, A4, A7, A2, A5, A8]
我已尝试使用以下代码:
def arr_sort(arr, algo):
arrtmp = arr
arrlen = len(arr)
if algo == 1:
return arr
if algo == 2:
count = 0
while count < (arrlen - 1):
for index, val in enumerate(arr):
if index % 3 == 0:
arrtmp[count] = val
count += 1
for index, val in enumerate(arr):
if index % 3 == 1:
arrtmp[count] = val
count += 1
for index, val in enumerate(arr):
if index % 3 == 2:
arrtmp[count] = val
count += 1
return arrtmp
def arr\u排序(arr,algo):
arrtmp=arr
arrlen=len(arr)
如果algo==1:
返回arr
如果algo==2:
计数=0
当计数<(arrlen-1)时:
对于索引,枚举中的val(arr):
如果索引%3==0:
arrtmp[count]=val
计数+=1
对于索引,枚举中的val(arr):
如果索引%3==1:
arrtmp[count]=val
计数+=1
对于索引,枚举中的val(arr):
如果索引%3==2:
arrtmp[count]=val
计数+=1
返回arrtmp
它不能正常工作,因为arr
在整个while循环中都会发生变化,我真的不明白为什么。
(我也知道我也可以在for循环中执行“f index%”…
位,但无论如何都应该可以,对吗?)
是否有一个预先存在的函数可以替代此功能?您正在按
3
的模重新排序:
l = [0,1,2,3,4,5,6,7,8]
l_sorted = sorted(l, key=lambda x: x%3)
print(l_sorted)
# [0, 3, 6, 1, 4, 7, 2, 5, 8]
如果您是在索引上而不是在值上重新排序,那么需要enumerate
进行更详细的操作:
l_sorted = [x[1] for x in sorted(enumerate(l), key=lambda x: x[0]%3)]
print(l_sorted)
# [0, 3, 6, 1, 4, 7, 2, 5, 8]
设
a=[0,1,2,3,4,5,6,7,8]
a[::3]
将为您提供每三个元素:[0,3,6]
a[n::3]
将从n
开始,每三个元素给你一个,所以a[1::3]
变成[1,4,7]
,a[2::3]
变成[2,5,8]
将这些列表与指定的
+
连接:a[0::3]+a[1::3]+a[2::3]
计算结果为[0,3,6,1,4,7,2,5,8]
。另一个基于索引的是
l_sorted = sum([l[x::3] for x in range(3)],[])
下面是一个通过在某个步骤上分组将列表链接在一起的通用解决方案。用于将每个步骤的结果组链接在一起
from itertools import chain
def step_chain(l, step_len):
return chain.from_iterable(l[s::step_len] for s in range(step_len))
演示:
>>> l = [0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> list(step_chain(l, 2))
[0, 2, 4, 6, 8, 1, 3, 5, 7]
>>> list(step_chain(l, 3))
[0, 3, 6, 1, 4, 7, 2, 5, 8]
如果步长不能很好地适应列表,则会将附加元素放在新列表的末尾,如果步长大于列表,则显然会返回原始列表
>>> step_chain(l, 7)
[0, 7, 1, 8, 2, 3, 4, 5, 6]
>>> step_chain(l, 100)
[0, 1, 2, 3, 4, 5, 6, 7, 8]
为什么您的尝试无效 当您设置
temp_arr=arr
时,temp_arr
只是对与arr
相同的基础(可变)列表的引用。因此您正在对其进行修改。您可以将temp_arr
和arr
视为附加到相同基础列表对象的两个“便笺”,它们将相应地更改
如果您使用内置的
arrtmp = list(arr)
你的方法适用于这种特殊情况。Downvote:在这里提问之前,请至少检查一下谷歌的基本结果。可能重复的
random。shuffle
似乎可以解决问题。或者是这样,或者我不理解这个问题。是的,除其他外。但是第一个列表的排序顺序是什么?所需的转换信息描述得非常清楚,如果你的亲密选民愿意阅读问题,包括标题。我认为所需的顺序是基于索引,而不是值。我会发布该解决方案,但问题显然被搁置。@MagnusHoff问题正是你在评论中所说的。你认为OP有意义,但不是吗我一点也不确定。所以在OP明确他在寻找什么之前,你不应该发布答案。啊,谢谢你的洞察力!我以为temp_arr=arr会创建一个新的列表,一份副本。这实际上解释了我脚本另一部分的另一个问题:)