带有字典、列表和 If 语句的嵌套循环

Posted

技术标签:

【中文标题】带有字典、列表和 If 语句的嵌套循环【英文标题】:Nested Loop With Dictionary, List and If Statement 【发布时间】:2021-11-18 21:53:23 【问题描述】:

所以,我有一本字典,将美国各州的缩写按地区分组。然后我有一个带有州缩写的 Pandas DataFrame 列。我正在尝试遍历字典值以查找匹配项并将区域名称/字典键附加到列表中。它似乎有效,但我遗漏了一些缩写,因此,总列表长度为 463。但是,当我添加 else-statement 来尝试解释缺失的状态时,列表长度会跳到 16500。

有人能解释一下这里发生了什么吗?

user_df['State'] 包含以下缩写:

user_df['State'].unique()
>>> ['GA', 'WA', 'NV', 'OK', 'TX', 'CA', 'MI', 'FL', 'OH', 'IL-IN-WI', 'TN', 'NY-NJ-PA', 'PA', 'DC-VA-MD-WV', 'IN', 'NE-IA', 'PA-NJ-DE-MD', 'AL', 'NC-SC', 'CO', 'NM', 'MA-NH', 'AZ', 'OR-WA', 'OH-KY-IN', 'SC', 'NY', 'TN-MS-AR', 'KY-IN', 'RI-MA', 'UT', 'HI', 'CT', 'LA', 'VA-NC', 'MD', 'WI', 'VA', 'MO-IL', 'MN-WI', 'MO-KS', 'NC']
region_dict = 
    
region_dict['northeast'] = ['NY-NJ-PA', 'PA-NJ-DE-MD', 'NY', 'CT', 'MA-NH','RI-MA', 'DC-VA-MD-WV']   
region_dict['midwest'] = ['OH', 'OK', 'MI', 'IL-IN-WI', 'NE-IA', 'MO-KS', 'MN-WI']
region_dict['southeast'] = ['TX','NC-SC', 'NC-VA', 'GA', 'FL', 'TN', 'KY-IN', 'TN-MS-AR', 'LA', 'IN' ]
region_dict['pacific'] = ['CA', 'NV', 'OR', 'WA', 'HI', 'OR-WA']
region_dict['intermountain'] = ['NM', 'CO', 'AZ']

region_list = []
    
for row in user_df['State']:
    for k, v in region_dict.items():
        for el in v:
            if el == row:
                region_list.append(k)
                # Until here it works for 463 but when I add the line below 
                # to fill in for missing values in my dictionary I get 16500
            else:
                region_list.append('Unknown')

【问题讨论】:

请分享user_df @balderman 我从有问题的列中添加了唯一值,有一些我没有的缩写,例如 PA。我可以将它们全部添加并且没有错误,但我想了解发生了什么。为什么当我添加一个 else 语句来解释缺失值时,循环会失控? 为什么您的查找表不在相反的方向? region_dict['CO'] = ['intermountain'] 等等? 这种方式打字速度更快,不就是意味着在循环中反转 k、v 吗? 用相反的方向你会保存一个循环 - 不是吗? 【参考方案1】:

对于user_df 的每一行,您将为region_dict 中包含的33 个区域中的每个 附加一个列表项。因此,结果的长度将为<number of rows of user_df> * <number of regions in region_dict>

正如@balderman 所建议的,颠倒您对region_dict 的定义将节省for-loop;事实上,在你的代码中甚至有两个for-loops,在反转region_dict之后(这是快速的并且不会随着user_df的大小而缩放)。代码变得更短,更容易理解正在发生的事情。

如果你不想打字,让 Python 自动为你反转字典,例如:

region_dict_inverted = 
for region in region_dict.keys():
    for abbr in region_dict[region]:
        region_dict_inverted[abbr] = region

然后你的循环将是

region_list = []

for state in user_df['State']:
    if state in region_dict_inverted:
        region_list.append(region_dict_inverted[state])
    else:
        region_list.append('unknown')

【讨论】:

对于单行的爱好者,使用字典理解反转region_dictregion_dict_inverted = state: region for region in region_dict.keys() for state in region_dict[region]

以上是关于带有字典、列表和 If 语句的嵌套循环的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌套 if/else 语句的 While 循环

带有 if 语句意外结果的 Python 嵌套循环

带有嵌套 if 语句的 while 循环的 Big-O 运行时

如何在带有嵌套字典的嵌套循环中正确使用字典“.update”函数[重复]

python中为啥我的for循环里嵌套的if只能循环一次?

急! jquery $.each 嵌套循环遍历