情境:
Quicksort编码挑战。
输入是两行:第1行=数据透视,第2行是未排序的整数列表 输出是一个列表,其值小于枢轴向左移动,后跟枢轴,值>>到枢轴。
示例:
输入:
7
1 2 4 9 3 7 11 5 12
输出:
1 2 4 3 5 7 9 11 12
我想在Python 3中做些什么(如果可能):
left,right = [(value,DO NOT ASSIGN)表示unsortedList中的值,如果值< pivot else (DO NOT ASSIGN,value)]
问题:
有没有办法做我想做的事情?我理解如何单独分配值,但如果在多次分配中需要分配值,则很奇怪。
'无'不会作为列表工作,我需要保持以前的值。
答案 0 :(得分:0)
我的意思是,你可以做这样的事情,通过filter
来近似相同的效果。请注意,list(filter(...))
只是为了实现过滤器的正确打印。
>>> unsorted = [1, 2, 4, 9, 3, 7, 11, 5, 12]
>>> pivot = 7
>>> left, right = [list(filter(lambda n: n < pivot, unsorted)), list(filter(lambda n: n >= pivot, unsorted))]
>>> left
[1, 2, 4, 3, 5]
>>> right
[9, 7, 11, 12]
但Python中没有“DO NOT ASSIGN”语法原语。
答案 1 :(得分:0)
您可以在最后使用None
,zip
和filter
来伪造它(尽管您还必须为快速排序重新定位7):
In [1]: l = map(int, "1 2 4 9 3 7 11 5 12".split())
In [2]: left, right = zip(*[(v, None) if v < 7 else (None, v) for v in l])
In [3]: left, right
Out[3]:
((1, 2, 4, None, 3, None, None, 5, None),
(None, None, None, 9, None, 7, 11, None, 12))
In [4]: filter(lambda x: x is not None, left), filter(lambda x: x is not None, right)
Out[4]: ((1, 2, 4, 3, 5), (9, 7, 11, 12))