我有一个包含多个对象和数组(包括日期)的JSON文件。而且我想选择一个对象的关键值日期是在2019年之前。
for b in data:
results = b['results']
for a in results:
if not results == []:
date_pyt = a["auction_datetime"]
date_datetime = datetime.strptime(date_pyt, "%Y-%m-%d").date()
maxdate = datetime(2018, 12, 31).date()
prices = [a["price_int_eu"] for a in results if maxdate >= date_datetime]
prices = [a for a in prices if a is not None]
print(prices)
我的输入:
{("id": 1,
"results": []},
{"id": 2,
"results": [
{
"auction_datetime": "2019-06-15",
"price_int_eu": 13325
},
{
"auction_datetime": "2018-08-25",
"price_int_eu": 5523
},
{
"auction_datetime": "2017-04-29",
"price_int_eu": 8309
},
{
"auction_datetime": "2016-10-20",
"price_int_eu": null
}
]}
输出:
[13325, 5523, 8309]
从理论上讲,13325
不会被打印。
答案 0 :(得分:4)
您要从results
中的一个元素中获取日期,然后过滤该日期的所有结果。因此,如果当前项目日期合适(在2019年之前),则将选择所有元素,对于下一个元素,您将再次执行相同的测试。每次使用prices
中当前元素的结果重新创建a
列表时,最后都只保留最后一个结果。
您需要使用一个循环。要么使用列表推导,要么使用完整的for
循环,而不要同时使用两者。
使用一个简单的循环:
maxdate = datetime(2018, 12, 31).date()
prices = []
for b in data:
results = b['results']
for a in results:
date_pyt = a["auction_datetime"]
date_datetime = datetime.strptime(date_pyt, "%Y-%m-%d").date()
if date <= max_date and a["price_int_eu"] is not None:
prices.append(a["price_int_eu"])
答案 1 :(得分:0)
您可以将每个结果的拍卖日期与2019年进行明确比较:
from datetime import date
def get_prices_before_year(data, year):
prices_before_year= []
for b in data:
results = b["results"]
for result in results:
auction_date = date(*map(int, result["auction_datetime"].split("-")))
if auction_date.year < year and result["price_int_eu"]:
prices_before_year.append(result["price_int_eu"])
return prices_before_year
def main():
data = [
{
"id": 1,
"results": []
},
{
"id": 2,
"results": [
{
"auction_datetime": "2019-06-15",
"price_int_eu": 13325
},
{
"auction_datetime": "2018-08-25",
"price_int_eu": 5523
},
{
"auction_datetime": "2017-04-29",
"price_int_eu": 8309
},
{
"auction_datetime": "2016-10-20",
"price_int_eu": None
}
]
}
]
print(get_prices_before_year(data, 2019))
if __name__ == "__main__":
main()
输出:
[5523, 8309]