【问题标题】:Python try except continue fails to print expected resultsPython try except continue 无法打印预期结果
【发布时间】:2013-04-13 07:11:06
【问题描述】:

有人能指出我哪里出错了吗,这里到底发生了什么,除了 continue 或解决这个问题的更好方法。

dic = {'arun': 123213, 'hari': 31212, 'akila': 321, 'varun': 12132, 'apple': 3212}
u1 = {'arun': 123123, 'orange': 1324214}
u2 = {'akila': 1234124, 'apple': 123123}
u3 = {'hari': 144}
u4 = {'anna': 23322}
for key, value in dic.iteritems():
    try:
        A = u1[key]
        B = u2[key]
        C = u3[key]
        D = u4[key]

    except KeyError:
        continue
    print A, B, C, D  # fails to print 

【问题讨论】:

  • 你期待什么结果?
  • @Kevin 显示字典 dic 中每个键(词)的 dicts u1、u2、u3 和 u4 的匹配值
  • 如果您想查看一些结果,请使用 pass 而不是 continue
  • @AshwiniChaudhary:那是个坏主意。如果他第一次遇到异常,pass 会给他一个NameError;如果他在第一次通过后遇到异常,pass 将导致他打印出上一个循环中的值……
  • @AshwiniChaudhary pass 不能解决我的问题

标签: python exception dictionary python-2.7


【解决方案1】:

试试这个:

dic = {'arun': 123213, 'hari': 31212, 'akila': 321, 'varun': 12132, 'apple': 3212}
u1 = {'arun': 123123, 'orange': 1324214}
u2 = {'akila': 1234124, 'apple': 123123}
u3 = {'hari': 144}
u4 = {'anna': 23322}

for key in dic:
    print list(d.get(key) for d in (u1, u2, u3, u4))

它将您的输出打印为列表:

>>> for key in dic:
...     print list(d.get(key) for d in (u1, u2, u3, u4))
... 
[123123, None, None, None]
[None, 1234124, None, None]
[None, 123123, None, None]
[None, None, 144, None]
[None, None, None, None]

【讨论】:

    【解决方案2】:
    • u2['hari'] 会引发异常
    • u3['akila'] 也会引发异常
    • u4['varun'] 也会再次引发异常

    您每次都尝试使用字典中的某个项目,尽管该项目不存在

    【讨论】:

      【解决方案3】:

      您的 'uX' 字典没有与 'dic' 相同的键,因此在尝试检索这些值时会失败。然后,您将捕获异常并调用“继续”,它会在您的打印语句执行之前自动跳回到循环的顶部。

      尝试取出 try/except 语句,Python 解释器将准确地吐出问题所在的错误。

      【讨论】:

        【解决方案4】:

        如果任何查找失败,continue 将从dic 跳到下一个键。您想使用即使找不到密钥也能保证给出结果的操作,例如dict.get:

        for key, value in dic.iteritems():
            A = u1.get(key)  # A is None if not found
            # ...
            print A, B, C, D
        

        【讨论】:

        • 谢谢!这行得通..有没有办法返回 0 而不是 None 因为我正在使用返回的值进行进一步的计算。我不想在每次 dict 搜索后为 None 添加检查条件。
        • @ArunprasathShankar 使用 u1.get(key,0)
        • @AshwiniChaudhary 完美!!
        猜你喜欢
        • 2019-06-26
        • 1970-01-01
        • 1970-01-01
        • 2013-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多