[英]Apply conditional to data being iterated over in list comprehension
我有以下 OrderedDict (我很抱歉格式化,我不知道如何讓它看起來可讀)。 我基本上有一個代表對話的對象,有時有屬於它的消息,有時沒有。
[OrderedDict([('id', 7), ('members', [OrderedDict([('id', 1), ('username', 'stefan'), ('email', 'sper1234@gmail.com')]), OrderedDict([('id', 10), ('username', 'Angela'), ('email', 'angela@testmail.com')])]), ('title', 'Conversation 1'), ('first_member_reveal', True), ('second_member_reveal', True), ('first_member_id', '1'), ('second_member_id', '10'), ('messages', [{'convo_id': 7, 'message': 'Conv 1 message 1', 'created_on': '03.05.2022 17:12:39', 'created_by': 1}])]), OrderedDict([('id', 23), ('members', [OrderedDict([('id', 1), ('username', 'stefan'), ('email', 'test@gmail.com')]), OrderedDict([('id', 11), ('username', 'Sharon'), ('email', 'sharon@testmail.com')])]), ('title', 'Conversation 8'), ('first_member_reveal', False), ('second_member_reveal', False), ('first_member_id', '1'), ('second_member_id', '11')])]
我正在對其應用以下代碼,以便根據創建屬於每個對話的最新消息的時間對字典進行排序。
sorted_data = sorted(
serialized_convos.data,
key=lambda x:
max(datetime.datetime.strptime(msg['created_on'], '%d.%m.%Y %H:%M:%S') for msg in x['messages'],
reverse=True)
該代碼執行我想要的,但如前所述,在某些情況下我正在迭代的內容中沒有“消息”鍵,所以我得到一個關鍵錯誤。 我嘗試在列表理解中添加以下條件,但它不起作用
max(datetime.datetime.strptime(msg['created_on'], '%d.%m.%Y %H:%M:%S') for msg in x['messages'] if 'messages'
in x.keys())
我還嘗試在代碼的“for”部分之前添加 if/else 條件並且沒有骰子。
如果我理解正確,您希望沒有消息的對話移到后面,而最新消息在前面。
您可以檢查"messages"
鍵是否在字典中,如果沒有,請提供一些人為的舊日期。 例如:
sorted_data = sorted(
data, # <-- is your data from question
key=lambda x: max(
datetime.datetime.strptime(msg["created_on"], "%d.%m.%Y %H:%M:%S")
for msg in x.get("messages")
)
if "messages" in x
else datetime.datetime(1970, 1, 1),
reverse=True,
)
印刷:
[
OrderedDict(
[
("id", 7),
(
"members",
[
OrderedDict(
[
("id", 1),
("username", "stefan"),
("email", "sper1234@gmail.com"),
]
),
OrderedDict(
[
("id", 10),
("username", "Angela"),
("email", "angela@testmail.com"),
]
),
],
),
("title", "Conversation 1"),
("first_member_reveal", True),
("second_member_reveal", True),
("first_member_id", "1"),
("second_member_id", "10"),
(
"messages",
[
{
"convo_id": 7,
"message": "Conv 1 message 1",
"created_on": "03.05.2022 17:12:39",
"created_by": 1,
}
],
),
]
),
OrderedDict(
[
("id", 23),
(
"members",
[
OrderedDict(
[
("id", 1),
("username", "stefan"),
("email", "test@gmail.com"),
]
),
OrderedDict(
[
("id", 11),
("username", "Sharon"),
("email", "sharon@testmail.com"),
]
),
],
),
("title", "Conversation 8"),
("first_member_reveal", False),
("second_member_reveal", False),
("first_member_id", "1"),
("second_member_id", "11"),
]
),
]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.