第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

對(duì)于列表的每個(gè)元素,從不同的列表中找到最接近的日期

對(duì)于列表的每個(gè)元素,從不同的列表中找到最接近的日期

三國(guó)紛爭(zhēng) 2021-08-05 17:43:19
我有 2 個(gè)列表:l1 = [ '09/12/2017', '10/24/2017' ]l2 = [ '09/15/2017', '10/26/2017', '12/22/2017' ]對(duì)于 l1 中的每個(gè)股票代碼,我想在它之后從 l2 中找到最接近的元素,所以輸出應(yīng)該是l3 = [ '09/15/2017', '10/26/2017' ]正確的方法似乎是以相反的順序在兩個(gè)列表上并行迭代,但我希望有一個(gè)更“pythonic”的解決方案..編輯:我確實(shí)想要一個(gè)最佳復(fù)雜度解決方案,它(假設(shè)列表已排序),我認(rèn)為是 O(max(len(l1), len(l2)))。
查看完整描述

3 回答

?
慕慕森

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊

您可以通過(guò)傳遞表達(dá)式將列表理解與min方法結(jié)合使用。lambda


from datetime import datetime

l1 = [ '09/12/2017', '10/24/2017' ]

l2 = [ '09/15/2017', '10/26/2017', '12/22/2017' ]


l1 = [min(l2, key=lambda d: abs(datetime.strptime(d, "%m/%d/%Y") - datetime.strptime(item, "%m/%d/%Y"))) for item in l1]

輸出


['09/15/2017', '10/26/2017']

如果您想要更有效的解決方案,您可以編寫(xiě)自己的insert排序算法。


def insertSortIndexItem(lst, item_to_insert):

  index = 0

  while index < len(lst) and item_to_insert > lst[index]:

    index = index + 1

  return lst[index]


l2 = sorted(l2, key=lambda d: datetime.strptime(d, "%m/%d/%Y"))

l1 = [insertSortIndexItem(l2, item) for item in l1]


查看完整回答
反對(duì) 回復(fù) 2021-08-05
?
狐的傳說(shuō)

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊

如果您的列表很長(zhǎng),則值得進(jìn)行預(yù)處理l2,以便能夠使用它bisect來(lái)查找最近的日期。然后,找到最接近日期的日期l1將是 O(log(len(l2)) 而不是 O(len(l2)) min。


from datetime import datetime

from bisect import bisect


l1 = [ '09/12/2017', '10/24/2017' ]

l2 = [ '09/15/2017', '10/26/2017', '12/22/2017' ]


dates = sorted(map(lambda d: datetime.strptime(d, '%m/%d/%Y'), l2))


middle_dates = [dates[i] + (dates[i+1]-dates[i])/2 for i in range(len(dates)-1)]


out = [l2[bisect(middle_dates, datetime.strptime(d,'%m/%d/%Y'))] for d in l1]


print(out)

# ['09/15/2017', '10/26/2017']

為了解決您的最后一條評(píng)論,這是使用迭代器和生成器的另一種解決方案,它l1僅在 開(kāi)始的必要部分結(jié)束l2:


from datetime import datetime

from itertools import tee, islice, zip_longest


def closest_dates(l1, l2):

    """

    For each date in l1, finds the closest date in l2,

    assuming the lists are already sorted.

    """

    dates1 = (datetime.strptime(d, '%m/%d/%Y') for d in l1)

    dates2 = (datetime.strptime(d, '%m/%d/%Y') for d in l2)

    dinf, dsup = tee(dates2)

    enum_middles = enumerate(d1 + (d2-d1)/2 

                             for d1, d2 in zip_longest(dinf, islice(dsup, 1, None), 

                                                       fillvalue=datetime.max))

    out = []

    index, middle = next(enum_middles)


    for d in dates1:

        while d > middle:

            index, middle = next(enum_middles)

        out.append(l2[index])


    return out

一些測(cè)試:


l1 = [ '09/12/2017', '10/24/2017', '12/11/2017', '01/04/2018' ]

l2 = [ '09/15/2017', '10/26/2017', '12/22/2017' ]

print(closest_dates(l1, l2))

# ['09/15/2017', '10/26/2017', '12/22/2017', '12/22/2017']


l2 = ['11/11/2018']  # only one date, it's always the closest

print(closest_dates(l1, l2))

# ['11/11/2018', '11/11/2018', '11/11/2018', '11/11/2018']


查看完整回答
反對(duì) 回復(fù) 2021-08-05
?
楊__羊羊

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊

假設(shè),如您的示例,日期按時(shí)間順序排列,您可以利用列表已排序的事實(shí)。例如,如果您樂(lè)于使用 3rd 方庫(kù),則可以使用 NumPy via np.searchsorted,這bisect是標(biāo)準(zhǔn)庫(kù)中更快的版本:


import numpy as np

from datetime import datetime


l1 = [ '09/12/2017', '10/24/2017' ]

l2 = [ '09/15/2017', '10/26/2017', '12/22/2017' ]


l1_dt = [datetime.strptime(i, '%d/%M/%Y') for i in l1]

l2_dt = [datetime.strptime(i, '%d/%M/%Y') for i in l2]


res = list(map(l2.__getitem__, np.searchsorted(l2_dt, l1_dt)))


# ['09/15/2017', '10/26/2017']


查看完整回答
反對(duì) 回復(fù) 2021-08-05
  • 3 回答
  • 0 關(guān)注
  • 219 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)