簡體   English   中英

如何找到列表的最長連續非零子集?

[英]How to find the longest consecutive non-zero subset of a list?

我有一個看起來像這樣的浮動列表:

[
 163.33333333333334,
 0.0,
 0.0,
 154.73684210526315,
 172.94117647058823,
 155.8303886925795,
 0.0,
 156.93950177935943,
 0.0,
 0.0,
 0.0,
 151.5463917525773,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 165.1685393258427,
 156.93950177935943,
 169.6153846153846,
 159.7826086956522,
 167.04545454545453,
 158.06451612903226,
 168.9655172413793,
 157.5,
 0.0,
 159.7826086956522,
 0.0,
 163.94052044609666,
 166.41509433962264,
 0.0,
 0.0,
 0.0,
]

實際列表比這大得多,但具有相似的值。 從這個列表中,我想找到這個非零的最大連續子集。 在這種情況下,這將是:


 [165.1685393258427,
 156.93950177935943,
 169.6153846153846,
 159.7826086956522,
 167.04545454545453,
 158.06451612903226,
 168.9655172413793]

我是 python 和 python 和一般編碼的新手,所以任何幫助將不勝感激。

您可以使用帶緩沖區的簡單算法

做一個for循環,然后獲取當前子集,然后如果當前子集的長度大於最大值,則設置為最大值。

def get_longest_consecutive_non_zero_subset(input_list: list) -> list:

    max_subset = []
    current_max_subset = []

    for number in input_list:
        if number > 0:
            current_max_subset.append(number)
        else:
            if len(current_max_subset) > len(max_subset):
                max_subset = current_max_subset
            current_max_subset = []

    return max_subset


test_list = [0, 1, 2, 3, 0, 0, 1, 2, 3, 4, 0]
result = get_longest_consecutive_non_zero_subset(test_list)

print(result)
assert result == [1, 2, 3, 4]

您可以使用itertools.groupby ,對值是否為 0 進行分組,然后 select 所有具有非零值的子列表並找到具有最大長度的子列表:

from itertools import groupby

g = groupby(l, key=lambda x:x>0.0)
m = max([list(s) for v, s in g if v > 0.0], key=len)
print(m)

Output(用於您的示例數據):

[
 165.1685393258427,
 156.93950177935943,
 169.6153846153846,
 159.7826086956522,
 167.04545454545453,
 158.06451612903226,
 168.9655172413793,
 157.5
]

請注意,由於您只需要與0進行比較,因此您可以只使用bool作為groupby function (即g = groupby(l, bool) )。 這應該比與0相比更快。

您可以利用groupby()處理未排序數據的方式:

from itertools import groupby

lst = [163.33333333333334, 0.0, 0.0, 154.73684210526315, 172.94117647058823, 155.8303886925795, 0.0, 156.93950177935943, 0.0, 0.0, 0.0, 151.5463917525773, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 165.1685393258427, 156.93950177935943, 169.6153846153846, 159.7826086956522, 167.04545454545453, 158.06451612903226, 168.9655172413793, 157.5, 0.0, 159.7826086956522, 0.0, 163.94052044609666, 166.41509433962264, 0.0, 0.0, 0.0]
result = max((list(g) for k, g in groupby(lst, bool) if k), key=len)
def max_non_zero_subset(arr):    
    max_non_zero = []    
    curr_non_zero = []    
    for n in arr:    
        if n == 0:    
            if len(curr_non_zero) > len(max_non_zero):    
                max_non_zero = curr_non_zero    
            curr_non_zero = []    
        else:                                                                           
            curr_non_zero.append(n)    
                                                                                    
    return max_non_zero if len(max_non_zero) >= len(curr_non_zero) else curr_non_zero     

您可以嘗試使用一些 if 語句。 因此,您說您是 python 的新手,我更喜歡讓代碼盡可能簡單,但優化它會是一個很好的“培訓”

fulllist = [163.33333333333334, 0.0, 0.0, 154.73684210526315, 172.94117647058823, 155.8303886925795, 0.0, 156.93950177935943, 0.0, 0.0, 0.0, 151.5463917525773, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 165.1685393258427, 156.93950177935943, 169.6153846153846, 159.7826086956522, 167.04545454545453, 158.06451612903226, 168.9655172413793, 157.5, 0.0, 159.7826086956522, 0.0, 163.94052044609666, 166.41509433962264, 0.0, 0.0, 0.0,]

longest = []
new_try = []

for element in fulllist:
    if element != 0:
        new_try.append(element)

    if new_try>longest:
        longest = new_try.copy()

    if element == 0:
        new_try = []

print(longest)

Output:

[165.1685393258427, 156.93950177935943, 169.6153846153846, 159.7826086956522, 167.04545454545453, 158.06451612903226, 168.9655172413793, 157.5]

暫無
暫無

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

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