省略多分配三元条件中的值

时间:2016-02-09 01:31:17

标签: python python-3.x conditional variable-assignment

情境:

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)]

问题:

有没有办法做我想做的事情?我理解如何单独分配值,但如果在多次分配中需要分配值,则很奇怪。

'无'不会作为列表工作,我需要保持以前的值。

2 个答案:

答案 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)

您可以在最后使用Nonezipfilter来伪造它(尽管您还必须为快速排序重新定位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))