簡體   English   中英

對列表理解中迭代的數據應用條件

[英]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.

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