writing a function to replicate data - python-2.7

im writing a function that takes in two parameters data which is meant to be replicated and times which is the number of times data should be replicated.
im new to python,can anyone help out
def replicate_iter(times, data):
output = times * data
if type(data) != str:
raise ValueError('Invalid')
if times <= 0:
return []
else:
return output.split(' ')
print replicate_iter(4, '5') #expected output [5, 5, 5, 5]
['5555']

This code is commented and will give you the desired output, but utilizes a for loop of size times.
def replicate_iter(times, data):
output = [] #you can initialize your list here
if type(data) != str:
raise ValueError('Invalid')
#if times <= 0: # Since input was initialized earlier
# return [] # These two lines become unnecessary
else:
for i in range(times): #use a for loop to append to your list
output.append(int(data)) #coerce data from string to int
return output #return the list and control to environment
print replicate_iter(4, '5')
Output is:
[5, 5, 5, 5]

You are returning output.split(' '), but your input '5' contains no spaces.
Therefore '5555'.split(' ') returns ['5555']. You will either need to change your return condition or add spaces between elements.
Adding spaces: (this assumes your string contains itself no spaces)
output = (times * (data + " ")).rstrip() # add a trailing space between elements and remove the last one
Changing the return / function: (this will support strings with spaces)
def replicate_iter(times, data):
output = []
if type(data) != str:
raise ValueError('Invalid')
while len(output) < times:
output.append(data)
return output

Related

How can I create a list with : separator?

I created a list of integer numbered with this function:
def collect_ints():
"""It returns the list of numbers entered by the user"""
ints = list()
keep_asking = True
while keep_asking:
n = input()
if n == "*":
keep_asking = False
if keep_asking:
ints.append(int(n))
return ints
However, in this way, I get a list of integers (on which I have to do some operations) with a comma (,) separator. How can I get the same list but with a : separator?
If you want to return exactly as a list data type it is not possible in python. But you can make it seem like a list using string formatting
def collect_ints():
ints = list()
keep_asking = True
while keep_asking:
n = input()
if n == "*":
keep_asking = False
if keep_asking:
ints.append(int(n))
output = "["
for i in ints:
output += "{}{}".format(i, ":")
output = output[:-1] + "]"
return output
The commas are used for visualizing lists. Lists do not have them, the print statement just prints them. So it is not possible to change them to other characters by default. But if you want to print them as a string with ':' as a delimiter, using 'replace' would be the best in my opinion.
def collect_ints():
"""It returns the list of numbers entered by the user"""
ints = list()
keep_asking = True
while keep_asking:
n = input()
if n == "*":
keep_asking = False
if keep_asking:
ints.append(int(n))
return str(ints).replace(',', ':')

Making a chessboard and i'm getting an IndexError: list index out of range

Title
I'm currently trying to get a user to input a chessboard using dashes (-) and the letters corresponding to the pieces. But the list isn't saving properly. Here's the code that's screwing up.
def make_a_chessboard():
chessboard = []
possible_char = ["-","K","k","Q","q","R","r","N","n","B","b","P","p"]
rows = 8
cols = 8
for r in range(rows):
user_input = input("")
while len(user_input) != 8:
print("That is not the correct length. Please try again.")
user_input = input("")
for i in range(len(user_input)):
flag1 = False
while flag1 == False:
if user_input[i] not in possible_char:
print("One of the characters used is not supported. Please try again.")
user_input = input("")
else:
for c in range(cols):
chessboard[r][c].append(user_input[c])
flag1 = True
return(chessboard)
This gives me the IndexError: list index out of range error. What am I doing wrong?
I'd recommend a bit of a restructure of the code so you test the validity once and completely of your input for each row, and then we can build the list of each position on a particular row, and append this to the chessboard list. The below is totally untested, so if there's syntax errors let me know and I'll edit it up.
def is_valid_row(user_in):
possible_char = ["-","K","k","Q","q","R","r","N","n","B","b","P","p"]
if len(user_in) != 8:
print("Please enter a string of 8 characters")
return False
for each_char in user_in:
if each_char not in possible_char:
print("You have entered illegal char {}".format(each_char))
return False
# Neither of those other two have returned false
# so we're good to assume it's valid
return True
def make_a_chessboard():
chessboard = []
rows = 8
# Process each row (you do this line by line, right?)
for r in range(rows):
user_input = input("")
while not is_valid_row(user_input):
user_input = input("")
# We now have valid input (or we're stuck in while-loop-hell)
# break the input into a list (of 8 valid chars)
each_row = [x for x in user_input]
# Now append it to chessboard
chessboard.append(each_row)
return(chessboard)

Accessing only the values in a dictionary

wordDict = {'y': 1, 'H': 1, 'e': 1}
The above is what I need to get just the value from. I am supposed to mark whether or not each word I have to evaluate is unique or not, which depends on if the values are 1 or above. How would I get access to only the value? I have tried wordDict[0][0] to get the first element of the whole array and then the first element within the dictionary, but that does not work.
import collections;
def main():
reading = read_file();
uniqueOrNot = isUnique(reading);
print uniqueOrNot;
def read_file():
with open('BWA5.in') as fp:
lines = fp.read().split();
fp.close(); #close file
return lines; #return lines to main function
def isUnique(words):
wordDict = [dict(collections.Counter(word)) for word in words];
for wordDict in wordDicts:
values = wordDict.values()
unique = all(value == 1 for value in values)
print wordDict;
main();
Get the values by
values = wordDict.values()
Now the unique thingy,
unique = all(value == 1 for value in values)
Now unique is a Boolean value holding True/False.
We could have also done:
notUnique = any(value > 1 for value in values)
This takes into consideration any 0 frequency letters which you might or might not have, depending on your algorithm.
For a list of dictionaries for multiple words, you can traverse through them all at a time by using a loop.
EDIT:
Final code:
import collections;
def main():
reading = read_file();
uniqueOrNot = isUnique(reading);
print uniqueOrNot;
def read_file():
with open('BWA5.in') as fp:
lines = fp.read().split();
fp.close(); #close file
return lines; #return lines to main function
def isUnique(words):
wordDicts = [dict(collections.Counter(word)) for word in words];
for wordDict in wordDicts:
values = wordDict.values()
unique = all(value == 1 for value in values)
print unique;
main();

Iterating through a .txt file in an odd way

What I am trying to do is write a program that opens a .txt file with movie reviews where the rating is a number from 0-4 followed by a short review of the movie. The program then prompts the user to open a second text file with words that will be matched against the reviews and given a number value based on the review.
For example, with these two sample reviews how they would appear in the .txt file:
4 A comedy-drama of nearly epic proportions rooted in a sincere performance by the title character undergoing midlife crisis . 2 Massoud 's story is an epic , but also a tragedy , the record of a tenacious , humane fighter who was also the prisoner -LRB- and ultimately the victim -RRB- of history .
So, if I were looking for the word "epic", it would increment the count for that word by 2 (which I already have figured out) since it appears twice, and then append the values 4 and 2 to a list of ratings for that word.
How do I append those ints to a list or dictionary related to that word? Keep in mind that I need to create a new list or dicitonary key for every word in a list of words.
Please and thank you. And sorry if this was poorly worded, programming isn't my forte.
All of my code:
def menu_validate(prompt, min_val, max_val):
""" produces a prompt, gets input, validates the input and returns a value. """
while True:
try:
menu = int(input(prompt))
if menu >= min_val and menu <= max_val:
return menu
break
elif menu.lower == "quit" or menu.lower == "q":
quit()
print("You must enter a number value from {} to {}.".format(min_val, max_val))
except ValueError:
print("You must enter a number value from {} to {}.".format(min_val, max_val))
def open_file(prompt):
""" opens a file """
while True:
try:
file_name = str(input(prompt))
if ".txt" in file_name:
input_file = open(file_name, 'r')
return input_file
else:
input_file = open(file_name+".txt", 'r')
return input_file
except FileNotFoundError:
print("You must enter a valid file name. Make sure the file you would like to open is in this programs root folder.")
def make_list(file):
lst = []
for line in file:
lst2 = line.split(' ')
del lst2[-1]
lst.append(lst2)
return lst
def rating_list(lst):
'''iterates through a list of lists and appends the first value in each list to a second list'''
rating_list = []
for list in lst:
rating_list.append(list[0])
return rating_list
def word_cnt(lst, word : str):
cnt = 0
for list in lst:
for word in list:
cnt += 1
return cnt
def words_list(file):
lst = []
for word in file:
lst.append(word)
return lst
##def sort(words, occurrences, avg_scores, std_dev):
## '''sorts and prints the output'''
## menu = menu_validate("You must choose one of the valid choices of 1, 2, 3, 4 \n Sort Options\n 1. Sort by Avg Ascending\n 2. Sort by Avg Descending\n 3. Sort by Std Deviation Ascending\n 4. Sort by Std Deviation Descending", 1, 4)
## print ("{}{}{}{}\n{}".format("Word", "Occurence", "Avg. Score", "Std. Dev.", "="*51))
## if menu == 1:
## for i in range (len(word_list)):
## print ("{}{}{}{}".format(cnt_list.sorted[i],)
def make_odict(lst1, lst2):
'''makes an ordered dictionary of keys/values from 2 lists of equal length'''
dic = OrderedDict()
for i in range (len(word_list)):
dic[lst2[i]] = lst2[i]
return dic
cnt_list = []
while True:
menu = menu_validate("1. Get sentiment for all words in a file? \nQ. Quit \n", 1, 1)
if menu == True:
ratings_file = open("sample.txt")
ratings_list = make_list(ratings_file)
word_file = open_file("Enter the name of the file with words to score \n")
word_list = words_list(word_file)
for word in word_list:
cnt = word_cnt(ratings_list, word)
cnt_list.append(word_cnt(ratings_list, word))
Sorry, I know it's messy and very incomplete.
I think you mean:
import collections
counts = collections.defaultdict(int)
word = 'epic'
counts[word] += 1
Obviously, you can do more with word than I have, but you aren't showing us any code, so ...
EDIT
Okay, looking at your code, I'd suggest you make the separation between rating and text explicit. Take this:
def make_list(file):
lst = []
for line in file:
lst2 = line.split(' ')
del lst2[-1]
lst.append(lst2)
return lst
And convert it to this:
def parse_ratings(file):
"""
Given a file of lines, each with a numeric rating at the start,
parse the lines into score/text tuples, one per line. Return the
list of parsed tuples.
"""
ratings = []
for line in file:
text = line.strip().split()
if text:
score = text[0]
ratings.append((score,text[1:]))
return ratings
Then you can compute both values together:
def match_reviews(word, ratings):
cnt = 0
scores = []
for score,text in ratings:
n = text.count(word)
if n:
cnt += n
scores.append(score)
return (cnt, scores)

find all ocurrences inside a list

I'm trying to implement a function to find occurrences in a list, here's my code:
def all_numbers():
num_list = []
c.execute("SELECT * FROM myTable")
for row in c:
num_list.append(row[1])
return num_list
def compare_results():
look_up_num = raw_input("Lucky number: ")
occurrences = [i for i, x in enumerate(all_numbers()) if x == look_up_num]
return occurrences
I keep getting an empty list instead of the ocurrences even when I enter a number that is on the mentioned list.
Your code does the following:
It fetches everything from the database. Each row is a sequence.
Then, it takes all these results and adds them to a list.
It returns this list.
Next, your code goes through each item list (remember, its a sequence, like a tuple) and fetches the item and its index (this is what enumerate does).
Next, you attempt to compare the sequence with a string, and if it matches, return it as part of a list.
At #5, the script fails because you are comparing a tuple to a string. Here is a simplified example of what you are doing:
>>> def all_numbers():
... return [(1,5), (2,6)]
...
>>> lucky_number = 5
>>> for i, x in enumerate(all_numbers()):
... print('{} {}'.format(i, x))
... if x == lucky_number:
... print 'Found it!'
...
0 (1, 5)
1 (2, 6)
As you can see, at each loop, your x is the tuple, and it will never equal 5; even though actually the row exists.
You can have the database do your dirty work for you, by returning only the number of rows that match your lucky number:
def get_number_count(lucky_number):
""" Returns the number of times the lucky_number
appears in the database """
c.execute('SELECT COUNT(*) FROM myTable WHERE number_column = %s', (lucky_number,))
result = c.fetchone()
return result[0]
def get_input_number():
""" Get the number to be searched in the database """
lookup_num = raw_input('Lucky number: ')
return get_number_count(lookup_num)
raw_input is returning a string. Try converting it to a number.
occurrences = [i for i, x in enumerate(all_numbers()) if x == int(look_up_num)]