Как перебрать строку, применяя условие? - PullRequest
0 голосов
/ 18 февраля 2019

Я пишу код, который присваивает каждой букве строки определенное число и возвращает окончательное число, когда она выполнила всю строку.

Я также пытался использовать 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

Ответы [ 5 ]

0 голосов
/ 19 февраля 2019

Если вы хотите использовать 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

Это решение должно быть очень быстрым.

0 голосов
/ 18 февраля 2019

Хорошо, давайте подумаем на секунду, что вы на самом деле делаете, чтобы вы поняли, почему он не работает:

Прежде всего, первая часть должна быть

full_name = full_name.upper()

Итакпеременная изменяется и сохраняется

Затем, пока вы внутри цикла for, вы спрашиваете

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

Поскольку 'A' будет в full_name, sum будет увеличено назначение, которое вы выбрали.Затем, не переходя к следующему шагу цикла, вы спрашиваете

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)

Надеюсь, это поможет.

0 голосов
/ 18 февраля 2019

Я думаю, что вы не сохраняете свой верхний перевод, и ваш итог может лгать вам.В любом случае, я бы использовал словарь значений с поиском вместо цепочки операторов 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)
0 голосов
/ 18 февраля 2019

Попробуйте:

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)
0 голосов
/ 18 февраля 2019
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, вы не хотите добавлять 5 к a, если он содержит A, B, C, D и E.

Для i в full_name выполняется итерация через full_name, и вы можете использовать i, так как каждый символ в full_name.

X в 'Y', возвращает true, если X в Y, поэтому просто используйте с ними логические операторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...