簡體   English   中英

遍歷python中的字典列表

[英]Iterate through list of dictionaries in python

我有以下格式的python詞典列表:

[{'item_value': 0.1, 'date': datetime.datetime(2017, ...), 'item_index': 1.0}, 
{'item_value': 0.22, 'date': datetime.datetime(2016, ...), 'item_index': 0.1}, 
{'item_value': 0.21, 'date': datetime.datetime(2016, ...), 'item_index': 1.0}
 ,..., 
{'item_value': 1.03, 'date': datetime.datetime(2016, ...), 'item_index': 1.0}]

可變item_index的取值為: [0.0, 0.1, 0.2, ..., 1.0] 0.0,0.1,0.2 [0.0, 0.1, 0.2, ..., 1.0]而可變item_value的取值在[-1,1]之間。 我想構造一個numpy向量,該向量包含使用日期的所有可能的item_index和最近的item_value (通過刪除具有相同item_value的重復並保留最新的值)。

我正在使用建議的解決方案:

np.array([d["item_value"] for d in sorted(my_list, key=lambda x: x["date"]))}

在本示例中,我創建了一個numpy向量,其中包含與日期[1.03, 0.22, 0.21, 0.1] 1.03,0.22,0.21,0.1]有關的所有item_values排序。 但是,我想返回一個矢量,如下例所示:

[0, 0.22, 0, 0, 0, 0, 0, 0, 0, 0.1]

向量的每個位置代表item_index的11個可能值,並具有item_value的最新值作為值。 我該怎么辦?

編輯

一個示例可以是:

[{'item_value': 0.0, 'date': datetime.datetime(2017, 10, 11, 13, 39, 36, 979000), 'item_index': 1.0}
{'item_value': 0.0, 'date': datetime.datetime(2017, 10, 11, 13, 40, 2, 368000), 'item_index': 1.0}
{'item_value': -1.0, 'date': datetime.datetime(2017, 10, 23, 9, 35, 20, 741000), 'item_index': 1.0}
{'item_value': -1.0, 'date': datetime.datetime(2017, 10, 23, 9, 35, 41, 915000), 'item_index': 0.8}
{'item_value': 0.0, 'date': datetime.datetime(2017, 10, 23, 9, 36, 2, 763000), 'item_index': 0.5}
{'item_value': 0.0, 'date': datetime.datetime(2017, 10, 23, 11, 40, 22, 427000), 'item_index': 1.0}
{'item_value': 0.0, 'date': datetime.datetime(2017, 11, 14, 7, 33, 9, 131000), 'item_index': 1.0}
{'item_value': 0.51, 'date': datetime.datetime(2017, 11, 15, 12, 50, 25, 14000), 'item_index': 1.0}
{'item_value': 0.0, 'date': datetime.datetime(2018, 1, 19, 14, 15, 46, 761000), 'item_index': 1.0}
{'item_value': -0.49, 'date': datetime.datetime(2018, 1, 19, 14, 16, 30, 207000), 'item_index': 1.0}
{'item_value': -0.009000000000000005, 'timestamp': datetime.datetime(2018, 1, 19, 16, 32, 30, 631000), 'item_index': 1.0}
{'item_value': 0.0, 'date': datetime.datetime(2018, 1, 19, 16, 33, 19, 509000), 'item_index': 1.0}
{'item_value': 0.0, 'date': datetime.datetime(2018, 1, 19, 16, 44, 59, 483000), 'item_index': 1.0}
{'item_value': -0.33299999999999996, 'date': datetime.datetime(2018, 1, 19, 18, 13, 17, 67000), 'item_index': 1.0}
{'item_value': 1.0, 'date': datetime.datetime(2018, 1, 19, 18, 13, 48, 443000), 'item_index': 1.0}
{'item_value': -0.33299999999999996, 'date': datetime.datetime(2018, 1, 19, 18, 14, 22, 871000), 'item_index': 1.0}
{'item_value': 0.0, 'date': datetime.datetime(2018, 1, 28, 11, 45, 48, 223000), 'item_index': 1.0}
{'item_value': 0.005000000000000003, 'timestamp': datetime.datetime(2018, 1, 28, 11, 46, 7, 481000), 'item_index': 1.0}
{'item_value': 0.0, 'date': datetime.datetime(2018, 1, 28, 11, 46, 27, 845000), 'item_index': 1.0}
{'item_value': 0.0, 'date': datetime.datetime(2018, 1, 28, 11, 46, 50, 386000), 'item_index': 1.0}]

單行代碼可能如下:

indexes = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]

my_filtered_lists = [sorted([d for d in my_list if d['item_index'] == i], 
                            key=lambda x: x["date"])
                        for i in indexes ]

result = [l[-1]['item_value'] if len(l)>0 else 0  for l in my_filtered_lists]

對於每個索引,您都將過濾列表,並根據需要對每個過濾后的列表進行排序,並獲取最后一個元素的item_value 如果數據集足夠大,則可能需要一點內存,因為您要為每個item_idex創建一個額外的列表。

經過測試:

 my_list = [
{'item_value': 0.1, 'date': datetime.datetime(2017, 05, 01), 'item_index': 1.0}, 
{'item_value': 0.22, 'date': datetime.datetime(2016,05,01), 'item_index': 0.1}, 
{'item_value': 0.21, 'date': datetime.datetime(2017, 05, 01), 'item_index': 0.1},
{'item_value': 1.03, 'date': datetime.datetime(2016,05,01), 'item_index': 1.0}]

它返回: [0, 0.21, 0, 0, 0, 0, 0, 0, 0, 0, 0.1] 0,0.21,0,0,0,0,0,0,0,0,0.1 [0, 0.21, 0, 0, 0, 0, 0, 0, 0, 0, 0.1]我所知是預期的輸出。

一種解決方案是創建一個中間dict key -> value僅保留最新值:

d = dict()
for value in sorted(my_list, key=lambda x: x["date"]):
   d[value['item_index']] = d[value['item_value']]

另一個解決方案是使用last()函數將列表轉換為pandas DataFrame ,按日期排序,按item_index分組,以僅保留數據幀的最新記錄。

暫無
暫無

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

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