簡體   English   中英

Django:合並兩個for循環

[英]Django: Combining two for loops

有沒有辦法將兩個for循環合並為一個? 我一直在尋找這樣的解決方案。 但這不是這樣的:

ticket_stats_by_event = {
    x['pk']: {'sold_tickets': x['sold_tickets'], 'available_tickets: y['avaiable_tickets']}
    for x, y in sold_tickets_by_event, available_tickets_by_event
}

結果將是:

<EventQuerySet [{'pk': 6, 'organizer': 1, 'available_tickets': 20, 'sold_tickets': 2}, {'pk': 1, 'organizer': 1, 'available_tickets': 1765746, 'sold_tickets': 2116}, {'pk': 5, 'organizer': 1, 'available_tickets': 10, 'sold_tickets': 1}, {'pk': 4, 'organizer': 1, 'available_tickets': 60, 'sold_tickets': 4}]>

這里的全部功能:

def ticket_stats_by_event(self, organizer):
    sold_tickets_by_event = [
        x for x in self.sold_tickets if x['organizer'] == organizer.pk
    ]

    # <EventQuerySet [{'pk': 6, 'organizer': 1, 'sold_tickets': 1}, {'pk': 1, 'organizer': 1, 'sold_tickets': 529}, {'pk': 5, 'organizer': 1, 'sold_tickets': 1}, {'pk': 4, 'organizer': 1, 'sold_tickets': 2}]>


    available_tickets_by_event = [
        x for x in self.available_tickets if x['organizer'] == organizer.pk
    ]

    # <EventQuerySet [{'pk': 1, 'organizer': 1, 'available_tickets': 1721}, {'pk': 4, 'organizer': 1, 'available_tickets': 30}, {'pk': 5, 'organizer': 1, 'available_tickets': 10}, {'pk': 6, 'organizer': 1, 'available_tickets': 20}]>


    ticket_stats_by_event = {
        x['pk']: {'sold_tickets': x['sold_tickets']}
        for x in sold_tickets_by_event
    }

    for item in available_tickets_by_event:
        pk = item.pop('pk')
        ticket_stats_by_event[pk].update(item)

    return ticket_stats_by_event

您可以只使用一個循環而不是四個來編寫這樣的函數:

def ticket_stats_by_event(self, organizer):

    ticket_stats_by_event = {}

    for st, at in zip(self.sold_tickets, self.available_tickets):

        # if organizer is not same in any then skip
        if organizer.pk != st['organizer'] or organizer.pk != at['organizer']:
            continue

        st_pk = st['pk']
        st_value = {'sold_tickets': st['sold_tickets'], 'organizer': st['organizer']}
        at_pk = at['pk']
        at_value = {'available_tickets': at['available_tickets'], 'organizer': at['organizer']}

        # add values from sold_tickets_by_event
        if st_pk in ticket_stats_by_event:
            ticket_stats_by_event[st_pk].update(st_value)
        else:
            ticket_stats_by_event[st_pk] = st_value
        # add values from available_tickets_by_event
        if at_pk in ticket_stats_by_event:
            ticket_stats_by_event[at_pk].update(at_value)
        else:
            ticket_stats_by_event[at_pk] = at_value

    return ticket_stats_by_event

此外,您可以將其分為三個循環,在第一和第二個循環中,您將獲取特定組織的已售票和可用票。 我沒有使用一種內襯函數來使其更具可讀性。

暫無
暫無

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

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