jia Jimmy
jia Jimmy

Reputation: 1848

Cannot get ordered result

I'm working with Python 3.5.2 and I'm trying to get a dictionary ordered by key by using OrderedDict.

Here is what I'm trying:

import re
from collections import OrderedDict

BRACKETS_PATTERN = re.compile(r"(?P<info>.*)?\((?P<bracket_info>.*?)\)")

def transform_vertical(vertical, trans=True):
    # elearning & Massive Online Open Courses (MOOCs) => ELEARNING_AND_MASSIVE_ONLINE_OPEN_COURSES
    # Repair & Maintenance (SMB) => SMB_REPAIR_AND_MAINTENANCE
    # Digital Advertising & Marketing/Untagged Agencies => DIGITAL_ADVERTISING_AND_MARKETING_OR_UNTAGGED_AGENCIES

    if not trans:
        return vertical
    else:
        v = vertical.replace(" & ", "_AND_").replace(", ", "_AND_").replace("/", "_OR_")
        brackets_search_result = BRACKETS_PATTERN.search(v)
        result = v
        if brackets_search_result:
            bracket_info = brackets_search_result.group("bracket_info")
            info = brackets_search_result.group("info")
            if bracket_info.upper() in ("SMB", "CBV"): # todo more prefix
                result = bracket_info.upper() + "_" + info
            else:
                result = info
        result = result.replace(" ", "_").upper().strip("_")
    return result

VERTICAL_MAP = OrderedDict({
    "GAMING": OrderedDict({
        "MOBILE_GAMING": 1,
        "AR_OR_VR_GAMING": 1,
        "CONSOLE_AND_CROSS_PLATFORM_GAMING": 1,
        "ESPORTS": 1,
        "PC_GAMING": 1,
        "REAL_MONEY_GAMING": 1,
    }),
    "TRAVEL": OrderedDict({
        "AUTO_RENTAL": 1,
        "RAILROADS": 1,
        "HOTEL_AND_ACCOMODATION": 1,
        "RIDE_SHARING_OR_TAXI_SERVICES": 1,
        "TOURISM_AND_TRAVEL_SERVICES": 1,
        "TOURISM_BOARD": 1,
        "AIR": 1,
        "TRAVEL_AGENCIES_AND_GUIDES_AND_OTAS": 1,
        "CRUISES_AND_MARINE": 1,
    })
})

s = list(VERTICAL_MAP[transform_vertical("Gaming")].keys())

print(s)

And I get non-ordered result like:

['REAL_MONEY_GAMING', 'AR_OR_VR_GAMING', 'MOBILE_GAMING', 'CONSOLE_AND_CROSS_PLATFORM_GAMING', 'ESPORTS', 'PC_GAMING']

Expected result:

[ 'MOBILE_GAMING', 'AR_OR_VR_GAMING','CONSOLE_AND_CROSS_PLATFORM_GAMING', 'ESPORTS', 'PC_GAMING', 'REAL_MONEY_GAMING']

What's wrong with my code and how to get an ordered result?

Upvotes: 0

Views: 60

Answers (1)

timgeb
timgeb

Reputation: 78750

Dictionaries are not insertion ordered in Python 3.5.

You are instantiating the ordered dicts with arbitrarily ordered regular dicts. Construct each of the ordered dicts from a list of (key, value) tuples.

Upvotes: 3

Related Questions