Apr-10-2019, 02:34 PM
(Apr-09-2019, 08:39 PM)Ceegen Wrote: PEP8 my dudes. It does help lol. Sure helped me!
Ran the original through pylint and made some changes. Some pylint warnings are still there which i don't understand how to remove.
"""Table Maker class for making ASCII formatted tables from provided data""" class TableMaker: """ anylist : Any list, tuple, set or string to be printed in ascii enclosed boxes (two dimensional maximum) title : Optional title for the list to be printed on top of the data headers : Optional headers to be printed (Provide as a one dimensional list with each list item representing a column heading) """ def __init__(self, provideddata, title, providedheaders): self.anydata = list(map(list, self.__all_strings(provideddata[:]))) self.__addresses = self.__generate_addresses() self.title = title if not isinstance(self.title, str): raise TypeError('String expected for argument#2') self.headers = providedheaders if self.headers != "": self.headers = self.__all_strings(providedheaders) self.table = [] self.columns = 0 self.rows = 0 self.__process(self.__all_strings(self.anydata)) def __generate_addresses(self): addressrange = [] maincounter = 0 innercounter = 0 for each in self.anydata: if isinstance(each, (list, tuple, set)): for eachinner in each: addressrange.append([maincounter, innercounter]) innercounter = innercounter+1 maincounter = maincounter+1 innercounter = 0 else: addressrange.append([maincounter, innercounter]) maincounter = maincounter+1 return addressrange def value(self, row, col, value): """Insert value into table""" if value != "": if [row, col] in self.__addresses: try: self.anydata[row][col] = value except IndexError: self.anydata[row] = value else: columnfound = [0, False] for loop in range(col, -1, -1): if [row, loop] in self.__addresses: columnfound = [loop, True] break if columnfound[1]: if not isinstance(self.anydata[row], list): self.anydata[row] = [self.anydata[row]] for loop in range(columnfound[0]+1, col): self.anydata[row].append("") self.anydata[row].append(value) else: rowfound = [0, False] for loop in range(row, -1, -1): if [loop, 0] in self.__addresses: rowfound = [loop, True] break if rowfound[1]: for loop in range(rowfound[0]+1, row+1): self.anydata.append([]) for loop in range(1, col+1): self.anydata[row].append("") self.anydata[row].append(value) self.__addresses = self.__generate_addresses() else: raise ValueError('Invalid data provided in argument#3') def update(self): """Update the table""" self.__process(self.__all_strings(self.anydata)) def print(self): """Print the table""" print("\n".join(self.table)) def __all_strings(self, data): """Courtesy of Yoriz""" if isinstance(data, list): items = [] for item in data: items.append(self.__all_strings(item)) return items elif isinstance(data, tuple): return tuple(self.__all_strings(list(data))) elif isinstance(data, dict): new_dict = {} for key, value in data.items(): new_dict[self.__all_strings(key)] = self.__all_strings(value) return new_dict elif isinstance(data, set): return set(self.__all_strings(list(data))) else: return str(data).strip() def __process(self, receivedlist): anylist = [] anylist = receivedlist[:] anylist = [i if i != [] else "" for i in anylist] if anylist: if self.headers != "": anylist.insert(0, self.headers) datalist = [] maxlen = len(self.title) collen = [] maxsubentry = 1 for entries in anylist: if isinstance(entries, (list, tuple)): if len(entries) > maxsubentry: maxsubentry = len(entries) for subentry in entries: if len(subentry) > maxlen: maxlen = len(subentry) if len(entries) > maxlen: maxlen = len(entries) collen = [0 for each in range(0, maxsubentry)] for entries in anylist: if isinstance(entries, (list, tuple)): for subentry in entries: if len(subentry) > collen[entries.index(subentry)]: collen[entries.index(subentry)] = len(subentry) else: if len(entries) > collen[0]: collen[0] = len(entries) checklen = 0 for each in collen: checklen += each if maxlen > checklen: collen[-1] = collen[-1]+(maxlen-checklen) else: maxlen = checklen if self.title != "": printstring = "+"+"-"*(maxlen+maxsubentry-1)+"+" datalist.append(printstring) printstring = "|"+self.title.upper()+" "*((maxlen+maxsubentry-1)- len(self.title))+"|" datalist.append(printstring) printstring = "|"+"-"*(maxlen+maxsubentry-1)+"|" datalist.append(printstring) else: printstring = "+"+"-"*(maxlen+maxsubentry-1)+"+" datalist.append(printstring) for entries in anylist: if isinstance(entries, (list, tuple)): printstring = "" counter = 0 for subentry in entries: printstring = printstring+"|"+subentry+" "*(collen[counter]- len(subentry)) counter += 1 if len(entries) < maxsubentry: for count in range(len(entries)+1, maxsubentry+1): printstring = printstring+"|"+" "*(collen[counter]) counter += 1 printstring = printstring+"|" datalist.append(printstring) else: printstring = "" printstring = printstring+"|"+entries+" "*(collen[0]-len(entries)) for count in range(0, maxsubentry-1): printstring = printstring+"|"+" "*(collen[count+1]) printstring = printstring+"|" datalist.append(printstring) printstring = "+"+"-"*(maxlen+maxsubentry-1)+"+" datalist.append(printstring) if self.title != "": rowlen = len(datalist)-4 else: rowlen = len(datalist)-2 if self.headers != "": rowlen = rowlen-1 if self.headers != "": printstring = "+"+"-"*(maxlen+maxsubentry-1)+"+" if self.title != "": datalist.insert(4, printstring) else: datalist.insert(2, printstring) self.table = datalist self.columns = len(collen) self.rows = rowlen return [datalist, len(collen), rowlen] else: raise ValueError('Invalid data provided in argument#1') if __name__ == "__main__": CITYTABLE = TableMaker([["1", "Tokyo", "Japan", "38,001,000"], ["2", "Delhi", "India", "25,703,168"], ["3", "Shanghai", "China", "23,704,778"], ["4", "Sao Paulo", "Brazil", "21,066,245"], ["5", "Mumbai", "India", "21,042,538"], ["6", "Mexico City", "Mexico", "20,998,543"], ["7", "Beijing", "China", "20,383,994"], ["8", "Osaka", "China", "20,237,645"], ["9", "Cairo", "Egypt", "18,771,769"]], "Largest Cities by Population", ["Rank", "City", "Country", "Population"]) CITYTABLE.print() print("\nUpdating incorrect value at row 6, column 2 i.e. China to Japan\n") CITYTABLE.value(6, 2, "Japan") CITYTABLE.update() CITYTABLE.print()