【问题标题】:Looping through characters of a string with int values循环遍历具有 int 值的字符串的字符
【发布时间】:2017-08-27 23:39:36
【问题描述】:

我正在尝试解决 USACO 培训中的一个测试用例:“你的车就在这里”。我试图分配字母数字值并将字符串中的每个字符相乘以获得产品。

例子:

C   O   M   E   T  Q       
3 *  15 *   13 * 5  * 20 * 17  =  994500 

不幸的是,产品总是一团糟。

key = {
    'A':1,
    'B':2,
    'C':3,
    'D':4,
    'E':5,
    'F':6,
    'G':7,
    'H':8,
    'I':8,
    'J':10,
    'K':11,
    'L':12,
    'M':13,
    'N':14,
    'O':15,
    'P':16,
    'Q':17,
    'R':18,
    'S':19,
    'T':20,
    'U':21,
    'V':22,
    'W':23,
    'X':24,
    'Y':25,
    'Z':26
}

file = open("testdata.txt", "r")

message = file.readline(2)

for character in message:
    preSignal = key[character]
    s = preSignal*key[character]
    print(s)

【问题讨论】:

  • 你基本上在每个新字符上覆盖s——你没有“携带”任何东西。在下面查看丹尼尔的答案...
  • 如果您注意到代码中以及@blacksite 提到的内容,您实际上是在对每个字母的值进行平方

标签: python string file dictionary character


【解决方案1】:

您每次都覆盖变量 s 并将平方 key[character] 保存到它(这是不对的)。您需要创建一个变量来保存结果。试试这个:

result = 1

for character in message:
    result *= key[character]

print(result)

【讨论】:

    【解决方案2】:

    在乘法之前,您需要将答案保存到 s,这样您的代码将是:

    key = {'A':1,
       'B':2,
       'C':3,
       'D':4,
       'E':5,
       'F':6,
       'G':7,
       'H':8,
       'I':8,
       'J':10,
       'K':11,
       'L':12,
       'M':13,
       'N':14,
       'O':15,
       'P':16,
       'Q':17,
       'R':18,
       'S':19,
       'T':20,
       'U':21,
       'V':22,
       'W':23,
       'X':24,
       'Y':25,
       'Z':26}
    
    infile = open("testdata.txt", "r")
    
    message = infile.readline(2)
    s=1
    for character in message:
    
        s = s*key[character]
    print(s)
    

    【讨论】:

      【解决方案3】:

      问题与解决方案

      您的问题是您实际上是在循环的每次迭代中覆盖s 的值。您需要创建一个变量来保存每次迭代的当前结果的值,并添加到该变量中

      result = 1
      for character in message:
          result *= key[character] # same as result = result * key[character]
      

      改进

      您可以简化字母到数字的映射:

      key = {chr(number): number - 64 for number in range(65, 91)}
      

      或者你可以使用string.ascii_letters:

      from string import ascii_letters
      key = {letter: number for number, letter in enumerate(ascii_letters, 1)}
      

      【讨论】:

        【解决方案4】:

        你可以试试这个:

        s = 1
        
        for i in message:
          s *= key[i]
        

        请注意,构建字母字典及其对应值的更简单方法是这样做:

        import string
        
        key = {a:i+1 for a, i in zip(string.ascii_uppercase, range(26))}
        

        对于纯Python3的解决方案,可以使用itertools.accumulate

        import itertools
        import operator
        result = list(itertools.accumulate([key[i] for i in message], func=operator.mul))[-1]
        
        print(result)
        

        输出:

        994500
        

        【讨论】:

          猜你喜欢
          • 2016-01-24
          • 2020-03-08
          • 1970-01-01
          • 2023-03-31
          • 2020-02-16
          • 2015-06-18
          • 1970-01-01
          • 2014-09-19
          相关资源
          最近更新 更多