在多重赋值三元条件中省略一个值

Omit a Value in a Multiple-Assignment Ternary Conditional

场景:

快速排序编码挑战。

输入是两行:第 1 行 = Pivot,第 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) for value in unsortedList if value < pivot else (DO NOT ASSIGN, value)]

问题:

有没有办法做我想做的事情?我了解如何单独分配值,但很好奇是否需要在多项分配中分配一个值。

'None' 不能作为列表使用,我需要保留以前的值。

我的意思是,你可以做这样的事情,这与 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"句法原语。

你可以用 Nonezip 和最后的 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))