簡體   English   中英

獲取列表中小於特定元素的最小元素的最快方法

[英]Fastest way to get minimum elements in a list less than a particular element

我最好用一個例子來解釋
假設,我有一個列表 [6,3,5,1,4,2]。

從索引 0 開始,查找所有小於(尚未標記)該索引處的值的項目。

Index 0: [6,3,5,1,4,2]  
Elements less than 6: 5{3,5,1,4,2} 
Visited array: [1 0 0 0 0 0]

Index 1: [6,3,5,1,4,2]  
Elements less than 3: 2 {1,2}
Visited array: [1 1 0 0 0 0]

Index 2: [6,3,5,1,4,2]  
Elements less than 5: 3 {1,4,2}
Visited array: [1 1 1 0 0 0]

Index 3: [6,3,5,1,4,2]  
Elements less than 1: 0 {NULL}
Visited array: [1 1 1 1 0 0]

Index 4: [6,3,5,1,4,2]  
Elements less than 4: 1 {2}
Visited array: [1 1 1 1 1 0]

This yields an array as [5 2 3 0 1 0]

目前使用,

def get_diff(lis):
    ans=[]
    for index,elem in enumerate(lis):
        number_of_smaller=len(filter(lambda x:x<elem ,lis[index+1:]))
        ans.append(number_of_smaller)
    return ans

但是,我有一種感覺,這不會有效率。 我如何使它值得一個巨大的清單? 我聞到前綴和了嗎? 謝謝,

您可以簡單地在 dict 推導中使用列表推導將項目保留為鍵,將小於它的項目保留為值(並使用collections.OrderedDict保留順序):

>>> from collections import OrderedDict
>>> def get_diff(lis):
...        return OrderedDict((item,[i for i in lis if i<item]) for item in lis)

由於您的條件<沒有必要排除項目本身,因為相比之下,刪除它的成本大於包含它的成本。

此外,如果您想保留索引,您可以使用enumerate循環遍歷您的列表:

def get_diff(lis):
       return OrderedDict((item,index),[i for i in lis if i<item]) for index,item in enumerate(lis))

如果您想計算這些項目的數量,您可以在sum函數中使用生成器表達式:

>>> from collections import OrderedDict
>>> def get_diff(lis):
...        return OrderedDict((item,sum(1 for i in lis if i<item)) for item in lis)

注意:如果您想計算的項目少於此后的任何項目(具有更大的索引),您可以簡單地在循環中使用索引:

>>> def get_diff(lis):
...        return OrderedDict((item,sum(1 for i in lis[index:] if i<item)) for index,item in enumerate(lis))
... 
>>> get_diff(l).values()
[5, 2, 3, 0, 1, 0]
my_list = [6,3,5,1,4,2] 

def get_diff(lis):
    result = []
    for visited, i in enumerate(range(len(lis))):
        limit = lis[i]
        elem = filter(None, [x if x < limit else None for x in lis][visited + 1:])
        result.append(len(elem))
    return result

print get_diff(my_list)
#[5, 2, 3, 0, 1, 0]

暫無
暫無

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

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