编写一个程序,用于分隔列表中的奇数和偶数

时间:2015-05-05 23:29:12

标签: 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()

2 个答案:

答案 0 :(得分:2)

这会将每个元素映射到int,以防Listlist字符串,然后根据它们是否为偶数对可迭代元素进行排序。 sorted()提供了一个稳定的排序(偶数将按原始顺序相对于彼此,奇数将按原始顺序相对于彼此)。

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

感谢@ Shashank的评论改进。

答案 1 :(得分:0)

有一种名为odd-even sort的排序。但它与你想要的东西无关。

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

相关问题