I am attempting to prompt the user to type four full names that exist in a text file, then compare the user input with the list of full names to see if they exist and display what the user inputted in the order entered. Every time I run this code the error keeps saying object is not subscriptable.
What's going wrong?
class Voting:
def __init__(self):
with open("PresidentCandidates.txt", 'r') as file:
lines = file.readlines()
self.Candidates = set([s.strip() for s in lines])
print(self.Candidates)
def presidentvoting(self):
userinput = input("Enter 4 names in the order of preference, who you will like to be president ")
userInput = list[userinput]
if userInput in self.Candidates:
print(userinput)
else:
print("fail")
In the line:
userInput = list[userinput]
you need to use normal brackets rather than square brackets. i.e.
userInput = list(userinput)
This should fix the error. However you have another bug in your code. To fix this, change:
userInput = list(userinput)
if userInput in self.Candidates:
print(userinput)
else:
print("fail")
to
userInput = userinput.split(' ')
for i in userInput
if i in self.Candidates:
print(userinput)
else:
print("fail")
This is because, you need to check each item in the userInput list against your text file list, rather than comparing the whole userInput list against your text file list.
This code fix assumes that your input is separated with spaces.
e.g. "President1 President2 President3 President4"
If you are using another separator, edit:
userInput = userinput.split(' ')
to
userInput = userinput.split(<INSERT SEPARATOR HERE>)
EDIT: 25/01/20 [REQUESTED NOT TO PRINT USERINPUT 4 TIMES]
change:
userInput = userinput.split(' ')
for i in userInput
if i in self.Candidates:
print(userinput)
else:
print("fail")
to
userInput = userinput.split(' ')
for i in userInput
if not (i in self.Candidates):
print("fail")
return
print(userinput)
Related
my last homework assignment is writing a script that finds the 5 most common email addresses in a text file (linked on hastebin below). I've found a way to find the single most common email address, but how can I expand this output to the top 5? Any help would be greatly appreciated.
while True:
try:
filename = input("Enter a file name: ")
fhand = open(filename, 'r')
email_addresses = {}
for line in fhand:
if line.startswith("From "):
email = line.split()[1]
email_addresses[email] = email_addresses.get(email, 0) + 1
max_address = None
max_emails = 0
for k in email_addresses:
if email_addresses[k] > max_emails:
max_address = k
max_emails = email_addresses[k]
print(max_address, max_emails)
print(email_addresses, email)
ans = input('Do you want to try another file?: (y/n): ')
ans = ans.lower()
if ans == 'y':
continue
if ans == 'n':
print('Thanks for playing!')
break
else:
continue
except:
print('File name',fname,'does not exist.')
continue
And the text file: https://hastebin.com/egixurubak.makefile
A quick idea:
Find the single most common email address in email_addresses, remove it from the dict, store it in a list, find the next single most common email address....
I am a noob in python and i need help.I have made a phonebook where you can add the contacts.But the problem is that when i exit the program the changes to the list are not saved.I want the user to be able to make permanent changes to the list.I have seen posts about a file=open("something",'w') code to do this(I think) but i dont know where to insert this code and i dont really understand what it is.Could someone help me understand what this is about..Here is the full code:
name = ["ranga","hari"]
number = [9895497777,9]
book = {name[0]:number[0],name[1]:number[1]}
def search():
print("Contacts:")
for x in book:
print(x,':',book[x])
while 1:
count = 0
a = 0
ch1 = input("search: ")
try:
ch1 = int(ch1)
except ValueError:
while a < len(name):
result = name[a].find(ch1)
if result == -1:
a = a + 1
else:
print(name[a],number[a])
a = a + 1
count = count + 1
if count == 0:
print("Not available.Try again")
continue
else:
break
ch1 = str(ch1)
while a < len(number):
sumber = str(number[a])
result = sumber.find(ch1)
if result == -1:
a = a + 1
else:
print(name[a],number[a])
a = a + 1
count += 1
if count == 0:
print("Not available.try again")
continue
else:
break
def add():
print("What is the name of the contact you want to add?")
name1 = input()
name.append(name1)
while 1:
print("What is the number of this contact?")
number1 = input()
try:
number1 = int(number1)
except ValueError:
print("Please type a number..")
continue
number.append(number1)
book[name1] = number1
break
def remoe():
print("Reference:")
for x in book:
print(x,':',book[x])
while 1:
print("What is the name of the contact you want to remove?")
name2 = input()
if name2 in book:
increment = name.index(name2)
name.pop(increment)
number.pop(increment)
del book[name2]
break
else:
print("Not available.Please try again")
while 1:
print("Contacts:")
for x in book:
print(x, ':', book[x])
print("\nWhat do you want to do?\n1.Search for a person\n2.edit the phone book\n3.exit")
choice = input()
try:
choice = int(choice)
except ValueError:
print("Type 1,2 or 3")
continue
if choice == 1:
search()
elif choice == 2:
while 1:
print("Do you want to:\n1.Add a contact\n2.Remove a contact\n3.Go back to main menu")
ch2 = input()
if ch2 in['3']:
break
else:
try:
ch2 = int(ch2)
except ValueError:
print("Type 1 or 2..")
if ch2 == 1:
add()
elif ch2 == 2:
remoe()
elif choice == 3:
exit()
else:
print("Type 1,2 or 3")
I appreciate the help.
When you choose to add a contact, it does properly add the name and number to the list. But, that is it.
When you re-run the program, the list gets re-assigned due to the first 2 lines of your code:
name = ["ranga","hari"]
number = [9895497777,9]
So, you won't see the last changes.
This is where you should maintain a file which lives outside the scope of your code, rather than a list.
You can modify your add function like this:
def add():
print("What is the name of the contact you want to add?")
name1 = input()
#name.append(name1)
# Just add the name1 variable's value to the file
with open('contacts_list.txt', 'a+') as f:
f.write(name1 + '\n')
while 1:
print("What is the number of this contact?")
number1 = input()
try:
number1 = int(number1)
except ValueError:
print("Please type a number..")
continue
#number.append(number1)
# Similarly, append the number1 variable's value to file again.
with open('contacts_list.txt', 'w+') as f:
f.write(number1)
#book[name1] = number1
with open('contacts_list.txt', 'r') as f:
print(f.read())
break
Note: You would also need to change the other functions search and remove to read and write from the file. I've just given you a taste of how things are done. You need to modify your code and make it work.
Let me know if it helps.
I took your advice and made a new text file but i still did not know how to do it but after reading ur answers i understood and at last i came to this..
removelist = []
def search():
while 1:
search = str(input("Search: "))
if search not in["exit", "Exit"]:
with open('output.txt', 'r+') as f:
line = f.readline()
while line:
data = line.find(search)
if not data == -1:
print(line.rstrip('\n'))
line = f.readline()
else:
line = f.readline()
else:
break
f.close()
def add():
print("Type the name of the contact:")
name = input()
while 1:
print("Type the number of this contact:")
number = input()
try:
number = int(number)
except ValueError:
print("Please type a number")
continue
number = str(number)
with open('output.txt', 'a+') as f:
f.write('\n' + name +' ' + number)
break
def remoe(): #this is where the problem comes in
while 1:
remove = str(input("Remove: "))
with open('output.txt', 'r+') as f:
line = f.readline()
while line:
if not remove in["Remove", "remove"]:
removelist.clear()
data = line.find(remove)
if not data == -1:
removelist.append(line) #This saves all the lines coming from the search to a
print(removelist) #removelist which can be accessed when you type in remove
line = f.readline() #But the problem is that if there is a \n at the end of the
else: #string then the remove function does not work
line = f.readline()
else:
print(removelist)
with open('output.txt', 'r') as f:
d = f.readlines()
f.close()
with open('output.txt', 'w') as f:
for i in d:
if i not in removelist:
f.write(i)
f.truncate()
f.close()
break
while 1:
with open('output.txt', 'r') as f:
data = f.read()
print("Contacts:")
print(data)
print('''What do you want to do?
1.Search for a contact
2.Edit contacts
3.Exit''')
f.close()
choice = input()
if choice in["1"]:
search()
elif choice in["2"]:
while 1:
print('''What do you wanna do:
1.Add a contact
2.Remove a contact
3.Exit to main menu''')
ch1 = input()
if ch1 in["1"]:
add()
elif ch1 in["2"]:
remoe()
elif ch1 in["3"]:
break
else:
print("Please type 1,2 or 3")
elif choice in[3]:
print("Ok bye")
else:
print("Please type 1,2 or 3")
Now the problem seems to be the remove function..if i try to remove a line with \n at the end of it then it wont work while the opp. seems to work.Any guess what i am doing here?
And thanks for the help Mayank porwal
At the first you should know name = ["ranga","hari"], number = [9895497777,9] that you have defined are in the code and you can not change those value, and after exit() they will reset to default value.
you should use of file (for example .txt file) in this issue:
1. you must create a .txt file in your project (for example Contacts.txt)
2. and write your information in there (for example in first line: Kourosh +98938....)
3. at the first step in your program you must read Contact.txt and load it in a structure like a list or dictionary (for example
>>> with open('workfile') as f:
... read_data = f.read()
>>> f.closed
)
4.now you can edit, add, remove structure.
5.and finally you can write structure in the file, before exit()
for example:
>>> with open('workfile') as f:
... f.write(s)
>>> f.closed
I'm trying to get this code to ask for the user's details then save them to a .txt file with commas separating the strings. I need to write to a new line every time I run the code but adding "/n" onto the end of the strings but it gives me all the user's data on the same line. any help?
print ("enter your name, age, and year group and password")
while True:
reg_name = input("Name:"))
reg_pass = input ("Password:")
reg_age = input ("age:")
reg_group = input ("Year Group")
print ("Is this infomation correct?")
print ("Name:",reg_name)
print ("password:",reg_pass)
print ("Age:",reg_age)
print ("Year Group:", reg_group)
reg_correct = input ("[Y/N]").lower()
if reg_correct == "y":
reg_user = reg_name[0:3]+reg_age
reg_write = open("D:\\Computer science\\Computing test\\logindata.txt","a")
reg_write.write (reg_user+","+reg_name+","+reg_pass+","+reg_age+","+reg_group+"/n")
print ("Your username is:",reg_user)
reg_write.close()
break
elif reg_correct == "n":
print ("Please Re-enter your infomation")
else:
Print ("Invalid input! Please try again...!")
I think that you may want \n instead of /n. It is the actual newline character. Otherwise, it would be adding "/n" between each statement in the file. \n creates a newline.
print ("enter your name, age, and year group and password")
while True:
reg_name = input("Name:"))
reg_pass = input ("Password:")
reg_age = input ("age:")
reg_group = input ("Year Group")
print ("Is this infomation correct?")
print ("Name:",reg_name)
print ("password:",reg_pass)
print ("Age:",reg_age)
print ("Year Group:", reg_group)
reg_correct = input ("[Y/N]").lower()
if reg_correct == "y":
reg_user = reg_name[0:3]+reg_age
reg_write = open("D:\\Computer science\\Computing test\\logindata.txt","a")
reg_write.write (reg_user+","+reg_name+","+reg_pass+","+reg_age+","+reg_group+"\n")
print ("Your username is:",reg_user) # ^^^
reg_write.close()
break
elif reg_correct == "n":
print ("Please Re-enter your infomation")
else:
Print ("Invalid input! Please try again...!")
Different way :
You can also avoid escape character by using writelines() method .
reg_write.writelines (reg_user+","+reg_name+","+reg_pass+","+reg_age+","+reg_group)
You can use the print function to write your information to a file. By using the pathlib module, you can easily run some error checking to help verify your file is accessible. With Python's recent addition of format strings, printing out variables can be very easy to accomplish.
#! /usr/bin/env python3
import pathlib
def main():
while True:
username = input('Username: ')
password = input('Password: ')
year_age = input('Age: ')
grouping = input('Group: ')
print('Is this information correct?')
print(f'Username: {username}\n'
f'Password: {password}\n'
f'Age: {year_age}\n'
f'Group: {grouping}')
# noinspection PyUnresolvedReferences
answer = input('Yes or no? ').casefold()
if 'yes'.startswith(answer):
path = pathlib.Path('login_data.csv')
if path.exists() and not path.is_file():
print('Your information cannot be saved.')
else:
with path.open('at') as file:
# noinspection PyTypeChecker
print(
username, password, year_age, grouping,
sep=',', file=file
)
break
elif 'no'.startswith(answer):
print('Please enter your information so that it is correct.')
else:
print('I did not understand your answer. Please try again.')
if __name__ == '__main__':
main()
So I originally completed this task with nothing but a few if, elif statements. But it was requested that I break the work of those statements out into a separate functions as an additional exercise. I need to acquire names to add to a list and have the ability to edit or remove the names. But Im struggling to have the functions return their output to the list.
Here is what I have so far
print("Roster Management")
def addplayer():
name=input("Enter new player name: ")
roster = [name]
list(roster)
roster.append(name)
def removeplayer():
name = input('Enter player for removal: ')
roster.remove(name)
def editplayer():
oldname = input('Enter name you want to edit: ')
newname = input('Enter new name: ')
[x.replace(oldname, newname) for x in roster]
while 1==1:
print('---------- Main Menu ------------')
print("Choose from the following options")
print('1. Display Team Roster')
print('2. Add Member')
print('3. Remove Member')
print('4. Edit Member')
print('9. Exit Program')
print(" ")
selection = input("Enter Selection: ")
if selection == '1':
for x in roster:
print(roster)
elif selection == '2':
addplayer()
elif selection == '3':
removeplayer()
elif selection == '4':
editplayer()
elif selection == '9':
print("Closing program...")
break`enter code here`
There're few things that are wrong with your code:
#1
roster = [name] # this creates a new list with a single element in it instead of appending to some existing list
list(roster) # you're trying to convert a list to a list, so not needed
roster.append(name) # you should've some local/global roaster to append to
#2
def removeplayer():
name = input('Enter player for removal: ')
roster.remove(name) # again, you should've some local/global roaster to append to
#in case of local you should return the list for further usage, in case of global you can simply remove
#3
[x.replace(oldname, newname) for x in roster]
# again you're neither updating any existing list/ nor returned anything
# also check if `x==oldname` then replace with new name
#4
for x in roster:
print(roster) # x is what you should be printing, not the whole list (roaster)
So, your updated code with these changes would be something like this:
roster = []
def addplayer():
name=input("Enter new player name: ")
roster.append(name)
def removeplayer():
name = input('Enter player for removal: ')
roster.remove(name)
def editplayer():
global roster
oldname = input('Enter name you want to edit: ')
newname = input('Enter new name: ')
roster = [newname if x == oldname else oldname for x in roster]
print("Roster Management")
while 1==1:
print('---------- Main Menu ------------')
print("Choose from the following options")
print('1. Display Team Roster')
print('2. Add Member')
print('3. Remove Member')
print('4. Edit Member')
print('9. Exit Program')
print(" ")
selection = input("Enter Selection: ")
if selection == '1':
for x in roster:
print(x)
elif selection == '2':
addplayer()
elif selection == '3':
removeplayer()
elif selection == '4':
editplayer()
elif selection == '9':
print("Closing program...")
break
Add
return list
at the end of your definition because right now the definition doesn't know what it is supposed to return. Also in your, if statement you should have
print(def())
instead of just
def()
Hope this helps
I am making a program to read from a file, alphabetize the info, and paste it into an output.. The only issue I am having is in the information that begins with quotes ("").
The main function for the program is to auto-sort MLA works cited pages (for fun obviously).
Here is the code... I would love any criticism, suggestions, opinions (Please keep in mind this is my first functioning program)
TL;DR -- How to ignore " 's and still alphabetize the data based on the next characters..
Code:
import os, sys
#List for text
mainlist = []
manlist = []
#Definitions
def fileread():
with open("input.txt", "r+") as f:
for newline in f:
str = newline.replace('\n', '')
#print(str)
manlist.append(str)
mansort(manlist)
#print("Debug")
#print(manlist)
def main():
print("Input Data(Type 'Done' When Complete or Type 'Manual' For file-read):")
x = input()
if x.lower() == 'done':
sort(mainlist)
elif x == '':
print("You must type something!")
main()
elif x.lower() == 'manual':
fileread()
else:
mainlist.append(x)
main()
def mansort(manlist):
print("What would you like to name the file?(Exit to Terminate):")
filename = input()
manlist = sorted(manlist, key=str.lower)
for s in manlist:
finalstring2 = '\n'.join(str(manlist) for manlist in manlist)
if filename == '':
print("You must choose a name!")
elif filename.lower() == 'exit':
sys.exit()
else:
with open(filename + ".txt", "w+") as f:
f.write(str(finalstring2))
def sort(mainlist):
os.system("cls")
mainlist = sorted(mainlist, key=str.lower)
for s in mainlist:
finalstring = '\n'.join(str(mainlist) for mainlist in mainlist)
print(finalstring)
print("What would you like to name the file?(Exit to Terminate):")
filename = input()
if filename.lower() == 'exit':
sys.exit()
elif filename == '':
print("You must type something!")
sort(mainlist)
else:
with open(filename + ".txt", "w+") as f:
f.write(str(finalstring))
print("\nPress Enter To Terminate.")
c = input()
main()
#Clears to prevent spam.
os.system("cls")
Please keep all criticism constructive... Also, just as an example, I want "beta" to come after alpha, but with my current program, it will come first due to "" 's
sorted(mainlist, key=str.lower)
You've already figured out that you can perform some transformation on each item on mainlist, and sort by that "mapped" value. This technique is sometimes known as a Schwartzian Transform.
Just go one step further - remove the quotes and convert it to lower case.
sorted(mainlist, key=lambda s: s.strip('"').lower())