【问题标题】:Dictionary Iteration Won't run fully字典迭代不会完全运行
【发布时间】:2021-06-18 01:53:31
【问题描述】:

所以,我正在尝试编写代码,允许您 1)输入一个短语 2)输入一个字符串,其中包含您要转换的货币(例如美元欧元;欧元英镑) 3)这两者的汇率.

如果您输入“我有 300 美元,然后我有 400 美元”(1)、“美元欧元”(2) 和 4 (3),它应该返回“我有 300 美元(~900 欧元) 然后我有 400 美元(~1600 欧元)。

但是,我下面的代码仅“转换”第一个对美元的引用(300 美元,但不是 400 美元),返回 - “我有 300 美元(~900 欧元),然后我有 400 美元”。我不确定我做错了什么。如果您在我的代码中看到错误,请告诉我!在此先感谢:)

phrase = "I had USD 300 and then I had USD 400"
currency = "USD EUR"
ratio = 4

if phrase and currency:
    z = phrase.split()
    for order,word in enumerate(z):
        dictionary = {order : word}
        for i in dictionary.values():
            if i == currency.split()[0]:
                firstplace = z.index(i)
                if currency.split()[1] not in z[int(firstplace) + 2]:
                    convertednumber = (int(float((z[int(firstplace) + 1])))) * int(float(ratio))
                    z.insert(int(firstplace) + 2, f'(~{currency.split()[1]} {convertednumber})')
                    emptyphrase = " "
                    phrase = emptyphrase.join(z)
                else:
                    pass
            else:
                pass

print(phrase)

附:我知道这不是一种特别有效的方法,但我只是想测试一下:)

【问题讨论】:

  • 请提供预期的MRE - Minimal, Reproducible Example。显示中间结果与预期结果的偏差。我们应该能够将您的代码块粘贴到文件中,运行它并重现您的问题。这也让我们可以在您的上下文中测试任何建议。您发布的程序挂起等待输入。不要指望我们提供测试数据:只需将您的 input 替换为引发问题的测试用例即可。
  • 我们还希望您在错误点之前跟踪可疑值。您对他们如何达到这些价值观感到困惑?
  • 而且你知道else: / pass 没用,可以删除,是吗?
  • 问题的很大一部分是您在迭代z 时对其进行了修改。那是行不通的。另一个大问题是firstplace = z.index(i) 总是会找到第一个出现的美元。确实,您需要一个一个地处理单词,并将每个单词复制到一个新列表中。
  • @Prune 非常感谢你,我很抱歉。我编辑了帖子。

标签: python dictionary enumerate forex currency-exchange-rates


【解决方案1】:

这可行,但存在问题。 “400”末尾的标点符号。被用作数字的一部分。在这里没关系,但它会造成一个尴尬的句子。但它可以给你基本的想法。

phrase = "I had USD 300 and then I had USD 400."
currency = "USD EUR"
ratio = 4

new = []
handle = False
for word in phrase.split():
    new.append( word )
    if word == currency.split()[0]:
        handle = True
    elif handle:
        convertednumber = int(float((word))) * int(float(ratio))
        new.append( f'(~{currency.split()[1]} {convertednumber})')
        handle = False

print(' '.join(new))

【讨论】:

  • 谢谢!这真的很有帮助并且可以完成工作!我有点不确定程序如何在 300 美元之后而不是在美元之后插入 ~ 1200 欧元(我在阅读您的代码后预计是后者,但它有效)
  • 我想我明白了 - 您的代码在句子中找到 USD,再运行一次迭代(此时我们已将 300 美元添加到列表中),然后添加转换后的数字。谢谢!
  • 是的。只需设置一点“状态”记忆。顺便说一句,我的代码版本 1 完全按照您所说的进行。 “美元(~1200 欧元)400”。
猜你喜欢
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2018-02-10
相关资源
最近更新 更多