【问题标题】:How can I fix a for loop that checks dictionary values?如何修复检查字典值的 for 循环?
【发布时间】:2021-09-22 10:18:46
【问题描述】:

我知道这听起来像是一个新手问题,但我很难尝试使循环工作。

我正在使用 Julia 语言创建一个简单的正则表达式,用于检查电话号码是否有效并根据代码区域返回该号码的资产。以下是详细信息:

1-用户输入电话号码;

2-Regex 测试它是否是一个有效数字;

3- 解析并检查区号是否存在于字典值中。如果是,那么它应该返回拥有该值的键。否则应该打印一条简单的消息,说明区号不存在。

问题是:循环尽可能长,每次在字典中检查值时打印该值是否可用。休息无济于事:一旦它得到第一次检查,它就会停止。

然后我注意到我必须将最后的打印语句从循环中取出,甚至可能分配一个变量来获取复制的值,但它仍然会用最后一个“数字不存在”结果覆盖。

如何重写此代码以使其正常工作?

regexTel = r"^(\+55)?[\s]?\(?(\d{2})?\)?[\s-]?(9?\d{4}[\s-]?\d{4})$"
areaCode = Dict("City A"=> [68],
            "City B"=> [82], [...] (and so on)

print("Type the phone number:\n")
telNum = readline()
validTel = (match(regexTel, telNum))
fnlAreaCd = parse(Int32, validTel[2])

for (cityCode, availbCode) in areaCode
    if fnlAreaCd in availbCode
        println("Phone number: ", validTel[3], "\n",
        "Area code: ", fnlAreaCd, "\n",
        "City: ", cityCode)
    else 
        println("Area code doesn't exist")
    end
end

【问题讨论】:

  • 与问题没有直接关系,但我不会在这里使用正则表达式。因为这意味着如果用户输入了正确的数字但分隔符错误,即使用户正确键入了数字,您也不会识别电话号码。相反,我会只保留数字并检查其中有 10 个。

标签: regex loops dictionary for-loop julia


【解决方案1】:

您对Dict 的使用对我来说似乎很奇怪。我认为你应该反过来使用它。

我相信区号是唯一的,那么变量areaCode会是这样的:

areaCode = Dict(68 => "City A", 82 => "City B", ...) # do you need to wrap them in an array?

它可以让你编写更简单的代码:

if haskey(areaCode, fnlAreaCd)
    cityCode = areaCode[fnlAreaCd]
    println("Phone number: ", validTel[3], "\n",
            "Area code: ", fnlAreaCd, "\n",
            "City: ", cityCode)
else 
    println("Area code doesn't exist")
end

【讨论】:

  • 感谢您的回答。不幸的是,我不能按照你说的做,因为这里有多个区号的庄园,所以我必须将它设置为庄园 A => [51,52,53,54,59 等]
  • 您可以在Dict 中添加其他条目,如果每个庄园可以有多个区号,但反之则不行
【解决方案2】:

匹配的城市不一定是字典中的第一个条目,但您已指示代码在任何时候发现不匹配时说它不存在!试试这个而不是你的裸循环:

function lookup_areacode(acode)
    code_exists = false
    for (cityCode, availbCode) in areaCode
        if acode in availbCode
            code_exists = true
            println("Phone number: ", tel, "\n",
            "Area code: ", acode, "\n",
            "City: ", cityCode)
        end
    end

    if !code_exists  
        println("Area code doesn't exist")
    end
end

lookup_areacode(fnlAreaCd)

您可能希望在函数内移动字典以保持整洁。

【讨论】:

  • 永远不要将布尔变量与比较运算符一起使用。而不是if code_exists == false,它应该是if !code_exists。它更清洁,更快。或者,更好的是,使用快捷方式code_exists || println("Area code doesn't exist")
  • 谢谢!旧习难改。更新了文本。
猜你喜欢
  • 2021-06-03
  • 2011-07-14
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多