好的,這是一個示例資料集:
returntime= '9:00'
data1 = {Name:'jim', cardriven: '20123', time:'7:30'}
data1 = {Name:'bob', cardriven: '20123', time:'10:30'}
data1 = {Name:'jim', cardriven: '201111', time:'8:30'}
data1 = {Name:'bob', cardriven: '201314', time:'9:30'}
我的問題是我需要能夠遍歷這些字典并找到他們都開過的車,然后比較他們開他們的時間,看看誰最接近 9:00 還車
我已經嘗試了很多回圈和創建串列等......但我知道必須是一種簡單的方法來說......
對于 [data1, data2....] 誰在最接近時間還車的人...這是該記錄中的資訊。
提前謝謝
uj5u.com熱心網友回復:
也許您可以嘗試僅使用 1 dict,其中 dict 中的每個條目都是另一個 dict,其鍵可能是驅動程式的名稱或 ID 代碼。
然后你可以遍歷那個 dict 并找出哪些 dict 條目駕駛了同一輛車。
這是我的意思的簡化示例
returntime= '9:00'
data1 = {'Name':'jim', 'cardriven': '20123', 'time': "7:30"}
data2 = {'Name':'bob', 'cardriven': '20123', 'time': "10:30"}
data3 = {'Name':'jim', 'cardriven': '201111', 'time': "8:30"}
dict = {}
dict[0] = data1
dict[1] = data2
dict[2] = data3
for i in range(len(dict)):
if dict[i]["cardriven"] == '20123':
print(dict[i]["Name"])
輸出:
jim
bob
還有一個專業提示:您可以將時間作為日期時間物件輸入到字典中,這將極大地幫助您比較時間。
uj5u.com熱心網友回復:
這將遍歷您提供的資料并將汽車放入字典中,該字典將跟蹤最接近目標時間的汽車。
import datetime
returntime = "09:00"
data = [
dict(name="Jim", cardriven="20123", time="7:30"),
dict(name="Bob", cardriven="20123", time="10:30"),
dict(name="Jim", cardriven="201111", time="8:30"),
dict(name="Bob", cardriven="201314", time="9:30"),
]
def parsedelta(s):
t = datetime.datetime.strptime(s, "%M:%S")
return datetime.timedelta(minutes=t.minute, seconds=t.second)
deltareturn = parsedelta(returntime)
def diffreturn(s):
return abs(deltareturn.seconds - parsedelta(s).seconds)
cars = {}
for datum in data:
car = datum["cardriven"]
if car not in cars:
cars[car] = datum
continue
if diffreturn(datum["time"]) < diffreturn(cars[car]["time"]):
cars[car] = datum
print(cars)
uj5u.com熱心網友回復:
由于我們想找到他們都開過的一輛車,我們可以創建一個字典,其中每個鍵是駕駛的汽車,每個值是名稱-時間對串列以及都開過的汽車串列。然后比較時間看看誰把它歸還給最接近的人returntime。
from datetime import datetime
temp = {}
both_drove = []
for data in [data1, data2, data3, data4]:
if data['cardriven'] in temp:
temp[data['cardriven']].append((data['Name'], data['time']))
both_drove.append(data['cardriven'])
else:
temp[data['cardriven']] = [(data['Name'], data['time'])]
returntime = datetime.strptime(returntime, '%H:%M')
for car in both_drove:
p1, p2 = temp[car]
if abs(datetime.strptime(p1[1], '%H:%M') - returntime) > abs(datetime.strptime(p2[1], '%H:%M') - returntime):
print(p2)
else:
print(p1)
輸出:
('jim', '7:30')
NB 不清楚哪個更接近returntime,10:30或7:30。
uj5u.com熱心網友回復:
這個問題的測驗資料有點奇怪。您基本上是在尋找 groupby 和 sort 方法,但是測驗資料中的 3 個組中有 2 個只有一個條目。此外,對于 car 20123,時間與回傳時間的距離相等(delta_min在我下面的回答中)。在這種情況下,以下sort_values步驟不會影響訂單。如果您知道應如何對等距條目進行排名,那么您可以進行下一步。
盡管如此,我認為最好的做法是將其轉換為 Pandas 日期框架并創建一個管道。對于這個資料
data1 = {"Name":'jim', "cardriven": '20123', "time":'7:30'}
data2 = {"Name":'bob', "cardriven": '20123', "time":'10:30'}
data3 = {"Name":'jim', "cardriven": '201111', "time":'8:30'}
data4 = {"Name":'bob', "cardriven": '201314', "time":'9:30'}
我們可以設計一個管道,該管道使用ljmc的答案中parsedelta提出的優秀功能的修改版本。
import datetime
import pandas as pd
data = pd.DataFrame([data1, data2, data3, data4])
# Name cardriven time
# 0 jim 20123 7:30
# 1 bob 20123 10:30
# 2 jim 201111 8:30
# 3 bob 201314 9:30
def timedelta(time):
t = datetime.datetime.strptime(time, "%H:%M")
return datetime.timedelta(hours=t.hour, minutes=t.minute).seconds / 60
returntime= '9:00'
latest_entries = (
data
.assign(delta_min=lambda d: abs(d["time"].apply(timedelta) - timedelta(returntime)))
.sort_values("delta_min")
.drop("delta_min", axis = 1) # comment this out if you want the minute difference
.drop_duplicates(subset="cardriven")
)
print(latest_entries)
這給了我們
Name cardriven time
2 jim 201111 8:30
0 jim 20123 7:30
3 bob 201314 9:30
更進一步,我們可以通過將timedelta函式直接作為步驟中的key引數傳遞來簡化管道sort_values。我們還拆分了 timedelta 函式。
def _timedelta(tm):
t = datetime.datetime.strptime(tm, "%H:%M")
return datetime.timedelta(hours=t.hour, minutes=t.minute).seconds / 60
def timedelta(time, rtrn_time):
return abs(_timedelta(time) - _timedelta(rtrn_time))
returntime= '9:00'
latest_entries = (
data
.sort_values("time", key=lambda d: d.apply(timedelta, rtrn_time=returntime))
.drop_duplicates(subset="cardriven")
)
print(latest_entries)
Name cardriven time
2 jim 201111 8:30
0 jim 20123 7:30
3 bob 201314 9:30
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/392958.html
