我想從字典中洗掉專案,其中值是數字,鍵是日期時間:條件:如果值相同,我想在 1h 內洗掉所有具有相同值的專案
#del duplicates within 60min
for formatted_key in list(formatted_dict.keys()):
for temp_key in list(formatted_dict.keys()):
print("formatted_key:", formatted_key)
print("temp_key:", temp_key)
if(formatted_dict[formatted_key]==formatted_dict[temp_key]):
if(temp_key!=formatted_key):
td=timedelta(minutes = 60)
new_key=formatted_key td
if (new_key>temp_key):
del formatted_dict[temp_key]
print("key to delet:", temp_key)
for key,value in formatted_dict.items():
print(key,value)
我得到的輸出直到錯誤:
**test data dict:**
2022-10-25 08:14:08.820000 var301533
2022-10-25 08:16:12.286000 var301533
2022-10-25 08:17:05.067000 var003907
2022-10-25 08:19:04.422000 var003907
2022-10-25 08:20:05.021000 var301504
2022-10-25 08:23:04.526000 var301504
2022-10-25 08:23:14.204000 var301504
**the for loops:**
formatted_key: 2022-10-25 08:14:08.820000
temp_key: 2022-10-25 08:14:08.820000
formatted_key: 2022-10-25 08:14:08.820000
temp_key: 2022-10-25 08:16:12.286000
key to delet: 2022-10-25 08:16:12.286000
**key and value gets deleted**
2022-10-25 08:14:08.820000 var301533
2022-10-25 08:17:05.067000 var003907
2022-10-25 08:19:04.422000 var003907
2022-10-25 08:20:05.021000 var301504
2022-10-25 08:23:04.526000 var301504
2022-10-25 08:23:14.204000 var301504
formatted_key: 2022-10-25 08:14:08.820000
temp_key: 2022-10-25 08:17:05.067000
formatted_key: 2022-10-25 08:14:08.820000
temp_key: 2022-10-25 08:19:04.422000
formatted_key: 2022-10-25 08:14:08.820000
temp_key: 2022-10-25 08:20:05.021000
formatted_key: 2022-10-25 08:14:08.820000
temp_key: 2022-10-25 08:23:04.526000
formatted_key: 2022-10-25 08:14:08.820000
temp_key: 2022-10-25 08:23:14.204000
formatted_key: 2022-10-25 08:16:12.286000
temp_key: 2022-10-25 08:14:08.820000
正確的鍵/值被洗掉,您可以在輸出中看到,但問題是外部 for 回圈仍然獲取已洗掉的鍵,但找不到已洗掉的值。
關鍵錯誤,但我沒有解決問題的方法:
if(formatted_dict[formatted_key]==formatted_dict[temp_key]):
KeyError: datetime.datetime(2022, 10, 25, 8, 16, 12, 286000)
預期輸出:
**final dict:**
2022-10-25 08:14:08.820000 var301533
2022-10-25 08:17:05.067000 var003907
2022-10-25 08:20:05.021000 var301504
uj5u.com熱心網友回復:
為了避免 KeyError,不推薦的更改(更好地使用另一種方法重寫您的代碼)是使用:
if( formatted_key in formatted_dict and temp_key in formatted_dict and formatted_dict[formatted_key]==formatted_dict[temp_key]):
和
if temp_key in formatted_dict: del formatted_dict[temp_key]
(避免字典 KeyError 的另一種方法是使用 Pythonstry: ... except ...:構造)
uj5u.com熱心網友回復:
一種方法是查看“唯一”值并用這些值創建一個新字典。
from datetime import datetime
def formatTime(strDt: str) -> datetime:
return datetime.strptime(strDt, "%Y-%m-%d %H:%M:%S.%f")
formatted_dict = {
"2022-10-25 08:14:08.820000": "var301533",
"2022-10-25 08:16:12.286000": "var301533",
"2022-10-25 08:17:05.067000": "var003907",
"2022-10-25 08:19:04.422000": "var003907",
"2022-10-25 08:20:05.021000": "var301504",
"2022-10-25 09:23:04.526000": "var301504",
"2022-10-25 09:23:14.204000": "var301504",
"2022-10-25 10:23:04.526000": "var301504",
"2022-10-25 10:23:14.204000": "var301504"
}
# create a new dictionary for the "unique" values,
# and add whatever is the first value from the initial dictionary as our starting point
new_dict = {
list(formatted_dict)[0]: formatted_dict[list(formatted_dict)[0]],
}
# iterate to keep the "uniques" every 60 mins
for key in formatted_dict:
# we look at the last value we added
if (formatTime(key) - formatTime(list(new_dict)[-1])).total_seconds() > 3600:
new_dict[key] = formatted_dict[key]
print(new_dict)
如果您的字典已經包含格式化的日期時間,請洗掉該formatTime位以滿足您的需要。
希望這可以幫助。
uj5u.com熱心網友回復:
首先創建一個新字典,該字典以輸入字典中的值為鍵。新字典中的值是日期/時間字串串列以及日期時間物件,以便我們可以對它們進行算術運算。
如果輸入字典中的日期/時間鍵不是按升序排列的,那么我們需要對它們進行排序。
接下來我們列舉新字典進行比較以確定需要洗掉原始字典中的哪些鍵。
json 模塊的匯入僅用于演示目的。
from datetime import datetime, timedelta
import json
formatted_dict = {
'2022-10-25 08:14:08.820000': 'var301533',
'2022-10-25 08:16:12.286000': 'var301533',
'2022-10-25 08:17:05.067000': 'var003907',
'2022-10-25 08:19:04.422000': 'var003907',
'2022-10-25 08:20:05.021000': 'var301504',
'2022-10-25 08:23:04.526000': 'var301504',
'2022-10-25 08:23:14.204000': 'var301504'
}
dict_by_value = {}
for k, v in formatted_dict.items():
dt = datetime.strptime(k, '%Y-%m-%d %H:%M:%S.%f')
dict_by_value.setdefault(v, []).append((k, dt))
for k, v in dict_by_value.items():
v.sort()
for (_, t1), (d2, t2) in zip(v, v[1:]):
if t2 - t1 < timedelta(hours=1):
del formatted_dict[d2]
print(json.dumps(formatted_dict, indent=2))
輸出:
{
"2022-10-25 08:14:08.820000": "var301533",
"2022-10-25 08:17:05.067000": "var003907",
"2022-10-25 08:20:05.021000": "var301504"
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/522531.html
標籤:Python循环字典钥匙
