写一个程序,在lis中分离奇数和偶数

2024-06-08 16:45:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个程序,把单数和偶数分开。有时我的程序有用,有时却不行。例如,如果我输入一个数字列表:4,6,99,78,输出是['4', '6', '78', '99']。这很好,但是当我输入2,3,4,5时,输出是['2', '3', '4', '5']。这是无法忍受的,请帮我解决这个!在

我的计划:

def oddEvenSort(List):
 Sorted = False
 while not Sorted:
    Sorted = True
    for i in range(1, len(List)-1,2):
        if (List[i] > List[i+1]):
            List[i], List[i+1] = List[i+1], List[i]
            Sorted = False

    for i in range(0, len(List)-1,2):
        if (List[i] > List[i+1]):
            List[i], List[i+1] = List[i+1], List[i]
            Sorted = False
  return List
def main():
  xs = (input("Enter some numbers (comma separated):").split(","))
  p = []
  for i in xs:
    p.append(i)
  y = oddEvenSort(p)
  print(y)

main()

Tags: in程序falseforlenifmaindef
2条回答

这将每个元素映射到一个int,以防List是一个list字符串,然后根据iterable的元素是否偶数对其进行排序。sorted()提供了一个稳定的排序(偶数将按照它们彼此之间的原始顺序排列,奇数将按照它们彼此之间的原始顺序排列)。在

def oddEvenSort(List):
    return sorted(map(int, List), key=lambda num: num%2)

感谢@Shashank的评论。在

有一种类型叫做odd-even sort。但这与你想要什么无关。在

奇偶排序对值进行排序,就像其他排序一样。它的名字来源于这样一个事实:它是通过比较奇偶索引和偶数索引来实现的(这使得并行化比冒泡排序更容易;否则它们几乎是等价的)。在

如果你真的读了维基百科的文章,你得到了伪代码(或者读了你实现的代码),这一切就变得非常清楚了。在

所以,如果你在问如何修正奇偶排序,将数组划分为奇偶值……那么,你就不能了,这就像是在问如何“修复”你的汽车轮子,这样它们就能在空中推动它。车轮不能推动汽车在空中行驶,至少如果没有对它们的基本工作方式进行巨大的改变,它们将不再与你开始的东西有任何关系。同样,排序算法不能将你的列表划分成奇数和偶数值,而不需要对它的基本工作方式进行如此大的更改,以至于它不再与你开始的内容有任何关系。在


当然,您可以在排序的基础上构建分区。例如:

def partition_odd_even(values, sort_function):
    decorated = [(value % 2, value) for value in values]
    sorted = sort_function(decorated)
    undecorated = [vv[1] for vv in decorated]
    return undecorated

然后,您可以使用任何有效的排序函数来调用它—快速排序实现、内置sorted函数或任何其他函数。你不必仅仅因为它有一个令人困惑的相似名称就实现一个完全不同的排序算法。在

另外,即使您想这样做,也最好使用key函数,如TigerhawkT3's answer。在

相关问题 更多 >