【问题标题】:How to iterate over a string applying a condition?如何迭代应用条件的字符串?
【发布时间】:2019-02-18 19:21:34
【问题描述】:

我正在编写一个代码,它给字符串的每个字母一个特定的数字,并在运行整个字符串时返回最终数字。

我也尝试过使用 elif,但没有得到正确的结果。

full_name = str(input('Enter  your full name: '))
full_name.upper()

sum = 0
for i in full_name:
    if 'A' or 'J' or 'S' in full_name:
        sum += 1
        if 'B' or 'K' or 'T' in full_name:
            sum += 2
            if 'C' or 'L' or 'U' in full_name:
                sum +=3
                if 'D' or 'M' or 'V' in full_name:
                    sum +=4
                    if 'E' or 'N' or 'W' in full_name:
                        sum+=5
                        if 'F' or 'O' or 'X' in full_name:
                            sum+=6
                            if 'G' or 'P' or 'Y' in full_name:
                                sum+=7
                                if 'H' or 'Q' or 'Z' in full_name:
                                    sum+=8
                                    if 'I' or 'R'  in full_name:
                                        sum+=9
print(sum)

我的代码正在运行,但我没有得到正确的号码。例如如果full_name = 'abc',运行代码我会得到sum = 135。我应该得到sum= 6

【问题讨论】:

  • 您的问题到底是什么?你想要更好的代码来解决你的问题,或者解释为什么你的代码不能工作,或者别的什么?

标签: python string for-loop


【解决方案1】:

我认为你没有保存你的上层翻译和你的总数可能是在骗你。无论如何,我会使用带有查找功能的值字典,而不是这样的 if 语句链。

full_name = str(input('Enter  your full name: ')).upper()

letters = {"A":1, "J":1, "S":1, "B":2, "K":2, "T":2, "C":3, "L":3, "U":3,
           "D":4, "M":4, "V":4, "E":5, "N":5, "W":5, "F":6, "O":6, "X":6,
           "G":7, "P":7, "Y":7, "H":8, "Q":8, "Z":8, "I":9, "R":9}

total = 0
for i in full_name:
    try:
        total += letters.get(i)
    except TypeError:   #handles items not in dictionary such as space and punct
        pass


print(total)

【讨论】:

    【解决方案2】:

    试试这个:

    full_name = input('Enter  your full name: ').upper()
    
    Sum = 0
    for i in full_name:
        if i == ('A' or 'J' or 'S'):
            Sum += 1
        if i == ('B' or 'K' or 'T'):
            Sum += 2
        if i == ('C' or 'L' or 'U'):
            Sum +=3
        if i == ('D' or 'M' or 'V'):
            Sum +=4
        if i == ('E' or 'N' or 'W'):
            Sum+=5
        if i == ('F' or 'O' or 'X'):
            Sum+=6
        if i == ('G' or 'P' or 'Y'):
            Sum+=7
        if i == ('H' or 'Q' or 'Z'):
            Sum+=8
        if i == ('I' or 'R'):
            Sum+=9
    print(Sum)
    

    您可以这样编写代码:

    full_name = input('Enter  your full name: ').upper()
    
    t = ''.maketrans('AJSBKTCLUDMVENWFOXGPYHQZIR','11122233344455566677788899')
    List = [i.translate(t) for i in full_name]
    
    Sum = 0
    for x in List:
        Sum += int(x)
    
    print(Sum)
    

    【讨论】:

      【解决方案3】:
      full_name = str(input('Enter  your full name: '))
      full_name = full_name.upper()
      
      sum = 0
      for i in full_name:
          if ('A' in i) or ('J' in i) or ('S' in i):
              sum += 1
          if ('B' in i) or ('K' in i) or ('T' in i):
              sum += 2
          if ('C' in i) or ('L' in i) or ('U' in i):
              sum +=3
          if ('D' in i) or ('M' in i) or ('V' in i):
              sum +=4
          if ('E' in i) or ('N' in i) or ('W' in i):
              sum+=5
          if ('F' in i) or ('O' in i) or ('X' in i):
              sum+=6
          if ('G' in i) or ('P' in i) or ('Y' in i):
              sum+=7
          if ('H' in i) or ('Q' in i) or ('Z' in i):
              sum+=8
          if ('I' in i) or ('R' in i):
              sum+=9
      print(sum)
      

      你犯了几个错误:

      .upper 确实返回到大写的字符串,但您需要将其保存在某个地方以备后用。

      您不想嵌套 if,您不想在 a 包含 A、B、C、D 和 E 的情况下添加 5。

      对于全名中的 i,遍历全名,您可以使用 i 作为全名中的每个字符。

      X 在 'Y' 中,如果 X 在 Y 中,则返回 true,因此只需使用逻辑运算符即可。

      【讨论】:

        【解决方案4】:

        好的,让我们想想你实际上在做什么,这样你就明白为什么它失败了:

        首先,第一部分应该是

        full_name = full_name.upper()
        

        所以变量被修改并存储

        然后,在你问的 for 循环中

        if 'A' or 'J' or 'S' in full_name
        

        因为'A' 将在full_namesum 将增加您选择的值。 然后,无需进入您所询问的循环的下一步

        if 'B' or 'K' or 'T' in full_name:
        

        因为'B' 将在full_name 中,所以sum 将增加您选择的值。

        您实际上根本没有使用您的i 变量,您再次询问'foo' 是否在full_name 中并且它总是这样(在您给出的示例中),然后 它进入第二步并再次执行,依此类推。

        您想要做的是使用您的 i 变量,以便您可以逐步评估,当它满足您的条件时,转到迭代的下一步。

        你想要做的应该看起来更像这样:

        full_name = full_name.upper()
        
        sum = 0
        for i in full_name:
            if i == 'A' or i == 'J' or i == 'S':
                sum += 1
            elif i == 'B' or i == 'K' or i == 'T':
                sum += 2
            elif i == 'C' or i == 'L' or i == 'U':
                sum +=3
            elif i == 'D' or i == 'M' or i == 'V':
                sum +=4
            elif i == 'E' or i == 'N' or i == 'W':
                sum+=5
            elif i == 'F' or i == 'O' or i == 'X':
                sum+=6
            elif i == 'G' or i == 'P' or i == 'Y':
                sum+=7
            elif i == 'H' or i == 'Q' or i == 'Z':
                sum+=8
            else i == 'I' or i == 'R':
                sum+=9
        
        print(sum)
        

        希望对你有帮助。

        【讨论】:

        • 您对if 闭包的解释并不完全正确。 ‘if ‘A’ or whatever in whatever’ 将始终被评估为 True,因为 ’A’True
        • 也许我表达错了,但这就是我的意思>你再次问'foo'是否在全名中,它总是这样(在你给出的例子中)
        • 尝试在控制台中评估这个:’A’ or ‘B’ in ‘C’
        【解决方案5】:

        如果你想使用if 语句,我会使用这个结构:

        full_name = full_name.upper()
        
        sum = 0
        for i in full_name:
            if i in 'AJS':
                sum += 1
            elif i in 'BKT':
                sum += 2
        ...
        

        这是我的解决方案。首先,您可以使用交集找到名称和字符串s 之间的常见字母。其次,您可以使用函数itemgetter() 从字典中获取值并将它们相加:

        from itertools import count
        from operator import itemgetter
        
        s = 'AJSBKTCLUDMVENWFOXGPYHQZIR'
        
        # create dict for lookups
        c = (i for i in count(start=1) for _ in range(3))
        d = {i: next(c) for i in s}
        # {'A': 1, 'J': 1, 'S': 1, 'B': 2, 'K': 2, 'T': 2, 'C': 3, 'L': 3, 'U': 3, 'D': 4, 'M': 4, 'V': 4, 'E': 5, 'N': 5, 'W': 5, 'F': 6, 'O': 6, 'X': 6, 'G': 7, 'P': 7, 'Y': 7, 'H': 8, 'Q': 8, 'Z': 8, 'I': 9, 'R': 9}
        
        def func(name):
            name = name.upper()
            intersec = set(name).intersection(s)
            return sum(itemgetter(*intersec)(d))
        
        print(func('Mykola Zotko'))
        # 33
        

        这个解决方案应该很快。

        【讨论】:

          猜你喜欢
          • 2020-06-08
          • 2019-07-15
          • 2016-05-09
          • 2010-09-19
          • 1970-01-01
          • 1970-01-01
          • 2014-04-21
          • 2010-10-24
          相关资源
          最近更新 更多