簡體   English   中英

如何將python列表或numpy數組中的所有非零元素移到一側?

[英]how to move all non-zero elements in a python list or numpy array to one side?

我將對列表或numpy數組執行以下操作:

[0, 0, 0, 1, 0, 0, 4, 2, 0, 7, 0, 0, 0]

將所有非零值移到右側:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 2, 7]

我如何有效地做到這一點?

謝謝

============

抱歉,我不清楚,我需要保留非零元素的順序。

您可以按其布爾值對列表進行排序。 所有偽造的值(數字僅為零)將被推到列表的最前面。 Python的內置排序看起來很穩定,因此其他值將保持其相對位置。

例:

>>> a = [0, 0, 0, 1, 0, 0, 5, 2, 0, 7, 0, 0, 0]
>>> sorted(a, key=bool)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 2, 7]

使用NumPy:

>>> a = np.array([0, 0, 0, 1, 0, 0, 4, 2, 0, 7, 0, 0, 0])
>>> np.concatenate((a[a==0], a[a!=0]))
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 2, 7])

您也可以通過使用簡單的for循環在Python的O(N)時間執行此操作。 但是會占用一些額外的內存,我們可以使用a.sort(key=bool)的解決方案中避免:

>>> from collections import deque
#Using a deque
>>> def solve_deque(lst):
    d = deque()
    append_l = d.appendleft
    append_r = d.append
    for x in lst:
        if x:
            append_r(x)
        else:
            append_l(x)
    return list(d) #Convert to list if you want O(1) indexing.
...
#Using simple list
>>> def solve_list(lst):                           
    left = []                                    
    right = []
    left_a = left.append
    right_a = right.append
    for x in lst:
        if x:
            right_a(x)
        else:
            left_a(x)
    left.extend(right)
    return left

>>> solve_list([0, 0, 0, 1, 0, 0, 4, 2, 0, 7, 0, 0, 0])
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 2, 7]
>>> solve_deque([0, 0, 0, 1, 0, 0, 4, 2, 0, 7, 0, 0, 0])
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 2, 7]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM