【问题标题】:How can I use string interpolation while iterating over a dictionary in python 3?在 python 3 中迭代字典时如何使用字符串插值?
【发布时间】:2020-11-23 17:36:49
【问题描述】:

我有一本字典,里面全是状态,它们的缩写映射到它们的实际名称。我想对它们进行迭代,因为我想让任务更容易(不想为每个状态都写出来)。到目前为止,我有一本这样的字典

state_dict = {
    'AK': 'ALASKA',
    'AL': 'ALABAMA',
    'AR': 'ARKANSAS',
    'AS': 'AMERICAN SAMOA',
    'AZ': 'ARIZONA ',
    'CA': 'CALIFORNIA ',
    'CO': 'COLORADO ',
    'CT': 'CONNECTICUT',
    'DC': 'DISTRICT OF COLUMBIA',
    'DE': 'DELAWARE',
    'FL': 'FLORIDA',
    'FM': 'FEDERATED STATES OF MICRONESIA',
    'GA': 'GEORGIA',
    'GU': 'GUAM ',
    'HI': 'HAWAII',
    'IA': 'IOWA',
    'ID': 'IDAHO',
    'IL': 'ILLINOIS',
    'IN': 'INDIANA',
    'KS': 'KANSAS',
    'KY': 'KENTUCKY',
    'LA': 'LOUISIANA',
    'MA': 'MASSACHUSETTS',
    'MD': 'MARYLAND',
    'ME': 'MAINE',
    'MH': 'MARSHALL ISLANDS',
    'MI': 'MICHIGAN',
    'MN': 'MINNESOTA',
    'MO': 'MISSOURI',
    'MP': 'NORTHERN MARIANA ISLANDS',
    'MS': 'MISSISSIPPI',
    'MT': 'MONTANA',
    'NC': 'NORTH CAROLINA',
    'ND': 'NORTH DAKOTA',
    'NE': 'NEBRASKA',
    'NH': 'NEW HAMPSHIRE',
    'NJ': 'NEW JERSEY',
    'NM': 'NEW MEXICO',
    'NV': 'NEVADA',
    'NY': 'NEW YORK',
    'OH': 'OHIO',
    'OK': 'OKLAHOMA',
    'OR': 'OREGON',
    'PA': 'PENNSYLVANIA',
    'PR': 'PUERTO RICO',
    'RI': 'RHODE ISLAND',
    'SC': 'SOUTH CAROLINA',
    'SD': 'SOUTH DAKOTA',
    'TN': 'TENNESSEE',
    'TX': 'TEXAS',
    'UT': 'UTAH',
    'VA': 'VIRGINIA ',
    'VI': 'VIRGIN ISLANDS',
    'VT': 'VERMONT',
    'WA': 'WASHINGTON',
    'WI': 'WISCONSIN',
    'WV': 'WEST VIRGINIA',
    'WY': 'WYOMING'
}

for k, v in state_dict.items():
    print("""if (c_state_code.equals("{k}"))
               {
                   out_state_code = "{v}";
               }""").format(k, v)

但是我得到 'NoneType' 对象没有属性 'format,我什至尝试了 .format 中的 **attrs 但得到了同样的错误。

【问题讨论】:

  • 因为print 返回None 而你正在调用print(...).format(k,v)
  • 我不知道您想要实现什么,但看起来您正在尝试使用 python dict 以另一种语言(Java?C#?)生成代码。这就引出了一个问题:为什么不使用该语言中的等效映射(即 HashMap)?
  • 是的,我使用 Python 在 Java 中创建代码,因为我不想全部输入,而且我对 Java 一点也不满意,Python 是我的主要语言。
  • @Alex 好吧,拥有 51 个 if 分支是相当混乱的,而不是使用 Java HashMap(这不是很难学习),但我想每个人都有自己的 :)
  • 我将不得不深入研究一下 hashmap,感谢您的建议,是的,这是相当多的 if 语句,所以是的,您可能有一点。

标签: python dictionary iteration string-interpolation


【解决方案1】:

您在print() 的结果上调用format(),它不会返回任何内容。应该在格式字符串上调用它——它需要在 print() 的参数中。

for k, v in state_dict.items():
   print("""if (c_state_code.equals("{k}"))
              {{
                  out_state_code = "{v}";
              }}""".format(k, v))

如果您使用的是 Python 3.6 版,则可以使用 f-string 使其更容易。

for k, v in state_dict.items():
   print(f"""if (c_state_code.equals("{k}"))
              {{
                  out_state_code = "{v}";
              }}""")

【讨论】:

  • 天哪,我不敢相信我把 .format 放在了错误的地方,很好,我猜今天是星期一!感谢您对 f 弦的提醒,我以前没有使用过这些,但它们看起来很漂亮!
  • 你忘了把out_state_code变量改成f-string!!!
  • @AyushGarg 语法突出显示很有趣,因为大括号应该是{{}}。我修好了。
  • @megargayu 在原来的 f-string 里面,不需要修改。这不是 Python 的输出。
  • @Barmar 哦,对了——我认为这只是语法高亮(@DeepSpace 指出)
【解决方案2】:

如果你想用这段代码,我觉得@Barmar's answer 还不错。但是,您似乎正在尝试复制和粘贴一百万个不同的 if 语句以将状态的首字母转换为状态名称。在这种情况下,我会使用字典(甚至将其存储在JSON 文件中!)

state_dict = {...}
out_state_code = state_dict[c_state_code]

import json
with open("states.json", "r") as states_file:
    state_dict = json.load(states_file)
out_state_code = state_dict[c_state_code]

【讨论】:

  • 他好像在用 Python 写其他语言的程序。
  • 是的,我想——这应该是 python @Barmar 中的一个例子
猜你喜欢
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 2016-10-25
  • 2011-04-06
  • 2011-08-22
相关资源
最近更新 更多