Home > OS >  How to count Y/N answers in Python?
How to count Y/N answers in Python?

Time:03-23

I've been trying to make a form using y/n as answers for each of the questions. I've been wondering if I could do the same thing like this, but for y/n questions instead of true/false statements.

Here's the code I've been working on.

print('Are You Ready for Omicron?')
print('Here\'s a test to make sure you\'re ready')
print('Note: please answer in y or n')
print('')
faceMask = input('Do you have a face mask? ')
faceShield = input('Do you have a face shield? ')
alcohol = input('Do you have alcohol in hand? ')

booleanList = [faceMask, faceShield, alcohol]
yCount = sum(booleanList)
print(yCount)

Based on the code, I was expecting to count the y answers but ended up with an error like this:

Traceback (most recent call last):
  File [REDACTED], line 14, in <module>
    yCount = sum(booleanList)
TypeError: unsupported operand type(s) for  : 'int' and 'str'

Any simple yet good ideas on how to do this?

CodePudding user response:

Your code basically resolves to

yCount = sum(["y", "n", "y"])

This will raise this error:

TypeError: unsupported operand type(s) for  : 'int' and 'str'

So you have to turn the elements into numbers to sum them:

>>> booleanList = ["y", "n", "y"]
>>> yCount = sum(1 for answer in booleanList if answer == "y")
>>> yCount
2

This will sum the values in booleanList as follows:

  • if value != "y", it is ignored
  • other values are summed by replacing them with 1

If you want to avoid higher language features like the generator expression above (1 for answer in ...), you can write this as follows:

for i in range(len(booleanList)):
    booleanList[i] = booleanList[i] == "y"
yCount = sum(booleanList)

This relies on the fact that True is considered to be 1 in arithmetic expressions:

>>> print(True   False   True)
2

CodePudding user response:

If you want to save one list comprehension and use less memory than Bluehorn's code, you could try this:

print('Are You Ready for Omicron?')
print('Here\'s a test to make sure you\'re ready')
print('Note: please answer in y or n')
print('')
faceMask = input('Do you have a face mask? ').lower() == 'y'
faceShield = input('Do you have a face shield? ').lower() == 'y'
alcohol = input('Do you have alcohol in hand? ').lower() == 'y'

booleanList = [faceMask, faceShield, alcohol]
yCount = sum(booleanList)
print(yCount)

Same caveat as Bluehorn's code, if input is not 'y', it will be ignored and hence not only 'n' but any other character other than 'y' or 'Y' will be considered as False.

CodePudding user response:

If you want to work with the example you cited, you could do this:

print('Are You Ready for Omicron?')
print('Here\'s a test to make sure you\'re ready')
print('Note: please answer in y or n')
print('')
faceMask = input('Do you have a face mask? ')
if faceMask == "y":
    faceMask = True
else:
    faceMask = False
faceShield = input('Do you have a face shield? ')
if faceShield == "y":
    faceShield = True
else:
    faceShield = False
alcohol = input('Do you have alcohol in hand? ')
if alcohol == "y":
    alcohol = True
else:
    alcohol = False
booleanList = [faceMask, faceShield, alcohol]
yCount = sum(booleanList)
print(yCount)

This is not a recommended solution but I wanted to remind you to use if/else

CodePudding user response:

I would put the awnsers in a list then count the totalt of y or no in the list.

print('Are You Ready for Omicron?')
print('Here\'s a test to make sure you\'re ready')
print('Note: please answer in y or n')
print('')
awnser_list = [] #empty list to fill
faceMask = input('Do you have a face mask? ')
faceMask = faceMask.lower() #make sure that all awnsers is in lower case.
faceShield = input('Do you have a face shield? ')
faceShield = faceShield.lower()
alcohol = input('Do you have alcohol in hand? ')
alcohol = alcohol.lower()
awnser_list.append(faceMask) #append the awnsers to the list
awnser_list.append(faceShield)
awnser_list.append(alcohol)
result = awnser_list.count("y") #count totalt of y in the list
print('Total of y: ',result)

BR

  • Related