如何在Python中保持列表中已排序数字的顺序相同

时间:2017-03-07 02:19:32

标签: python list loops sorting for-loop

我有一个功能:

  

给定一个Python值列表xs和一个非负整数n,构造并返回xs的副本,但每个值复制n次。请勿修改原始列表' xs'

为此,我创建了一些小代码,它们将列表xs相乘,然后对其进行排序。

last_update

此代码将导致函数输入,例如"复制([1,2,2,3],2)"输出为[1,1,2,2,2,2,3,3]这是正确的。注意正确的输出如何具有数字'匹配的地方。

然而,当列表中有一个负数时,'排序'函数将负数视为小于正数,并将负数的位置从最初在列表中的位置移位。

例如:复制([1,-1,2,1],2)输出到[-1,-1,1,1,1,1,2,2]而不是正确的版本,[ 1,1,-1,-1,2,2,1,1]。

注意负1是如何移位的?

我需要使用某种循环(while或for)来执行此任务,我无法弄清楚如何合并一个既保留数字位置又正确附加数字的循环到新列表(一个包含原始xs和重复项的新列表,与原始列表的顺序相同。

编辑:我应该补充一点,列表理解仅限于此任务

4 个答案:

答案 0 :(得分:3)

如果你想保持原始列表中元素的顺序,你可以使用嵌套列表理解,这将从列表 xs 中取出每个元素,重复n次然后去对于下一个元素等等:

xs = [1,-1,2,1]
n = 2

[x for x in xs for _ in range(n)]
# [1, 1, -1, -1, 2, 2, 1, 1]

xs = [1,2,3]
n = 2
[x for x in xs for _ in range(n)]
# [1, 1, 2, 2, 3, 3]

答案 1 :(得分:3)

def replicate(xs, n):
  return [item for item in xs for repeat in range(n)]

答案 2 :(得分:1)

您不需要对其进行排序。对于列表中的每个数字,循环UserData: "Fn::Base64": !Sub | <script> cfn-init.exe -v --stack ${AWS::StackName} --resource AutoScalingGroup --region ${AWS::Region} cfn-signal.exe -e 0 --stack ${AWS::StackName} --resource AutoScalingGroup --region ${AWS::Region} </script> 次并将其添加到新列表中,这样您就可以保留原始列表并仍然得到您想要的内容。

n

更简洁的方法是使用列表理解def replicate(xs,n): result = [] for num in xs: for _ in range(n): result.append(num) return result

无论哪种方式,return [num for num in xs for _ in range(n)]的输出都是replicate([1,-1,2,1],2)

答案 3 :(得分:1)

您可以创建单个元素列表,然后将其相乘。一旦你有了一个n元素列表,你可以best practices for using SAS结果列表和结果的那一部分。

result = []
for item in xs:
    nitems = [item] * n
    result.extend(nitems)

functools.reduce函数可用于此:

import functools
return functools.reduce((lambda a,b: a + [b]*n), xs, [])

内置sum可以做类似的事情:

return sum( [ [x]*n for x in xs], [])

extend()函数可以粘贴一堆迭代,所以你可以将这些值乘以一堆子列表并将它们传递给它:

import itertools
return list(itertools.chain(*[ [x]*n for x in xs ]))

或者,没有splat(*)运算符:

import itertools
return list(itertools.chain.from_iterable([[x]*n for x in xs])

或者,你可以zip原始列表反对自己,然后压扁那些元组。 (这对于长列表很有用,特别是如果你只能返回迭代而不是列表):

import itertools
return list(itertools.chain.from_iterable(zip(*[iter(xs) for _ in range(n)])))