Skip to main content
Fix string.join to str.join
Source Link
Marc
  • 5.7k
  • 2
  • 14
  • 35
  • Indentation: the first line is not indented correctly, there is an extra tab or spaces before def listsmash(listu):.
  • Code formatting: follow PEP 8 to format the code. You can use pep8online or just use the auto-formatting feature of many IDEs.
  • Bug: the output should be apples, bananas, tofu, and cats but the code outputs apples,bananas,tofu,and cats. There should be a space after the comma.
  • Edge case: if the input list contains only apples the code outputs and apples. This is an edge case to handle, probably at the beginning of the method.
  • Performance: there is no much to worry about performances, as it runs linearly to the input size. However, the first if condition is executed everytime:
    for x in range(len(listu)):
        if x == len(listu) -1 :
            y+= 'and '+ str(listu[x])
        else:
            y+= str(listu[x]) + ','
    
    Limit the number of iterations to len(listy) - 1 and add the last element outside the for-loop:
    def listsmash(listu):
        y = ''
        for x in range(len(listu) - 1):
            y += str(listu[x]) + ', '
        y += 'and ' + str(listu[-1])
        return y
    
  • Use stringstr.join: stringstr.join is a handy function in this case:
    def listsmash(listu):
        y = ', '.join(str(value) for value in listu[:-1])
        return y + ', and ' + str(listu[-1])
    
    It joins all elements of listu (except the last one) with , and then we can append the last element at the end. Additionally, the function .join() is faster than +=.
  • Naming: I am not sure what listu means, maybe you can consider a better name like items following from the problem description.
  • Indentation: the first line is not indented correctly, there is an extra tab or spaces before def listsmash(listu):.
  • Code formatting: follow PEP 8 to format the code. You can use pep8online or just use the auto-formatting feature of many IDEs.
  • Bug: the output should be apples, bananas, tofu, and cats but the code outputs apples,bananas,tofu,and cats. There should be a space after the comma.
  • Edge case: if the input list contains only apples the code outputs and apples. This is an edge case to handle, probably at the beginning of the method.
  • Performance: there is no much to worry about performances, as it runs linearly to the input size. However, the first if condition is executed everytime:
    for x in range(len(listu)):
        if x == len(listu) -1 :
            y+= 'and '+ str(listu[x])
        else:
            y+= str(listu[x]) + ','
    
    Limit the number of iterations to len(listy) - 1 and add the last element outside the for-loop:
    def listsmash(listu):
        y = ''
        for x in range(len(listu) - 1):
            y += str(listu[x]) + ', '
        y += 'and ' + str(listu[-1])
        return y
    
  • Use string.join: string.join is a handy function in this case:
    def listsmash(listu):
        y = ', '.join(str(value) for value in listu[:-1])
        return y + ', and ' + str(listu[-1])
    
    It joins all elements of listu (except the last one) with , and then we can append the last element at the end. Additionally, the function .join() is faster than +=.
  • Naming: I am not sure what listu means, maybe you can consider a better name like items following from the problem description.
  • Indentation: the first line is not indented correctly, there is an extra tab or spaces before def listsmash(listu):.
  • Code formatting: follow PEP 8 to format the code. You can use pep8online or just use the auto-formatting feature of many IDEs.
  • Bug: the output should be apples, bananas, tofu, and cats but the code outputs apples,bananas,tofu,and cats. There should be a space after the comma.
  • Edge case: if the input list contains only apples the code outputs and apples. This is an edge case to handle, probably at the beginning of the method.
  • Performance: there is no much to worry about performances, as it runs linearly to the input size. However, the first if condition is executed everytime:
    for x in range(len(listu)):
        if x == len(listu) -1 :
            y+= 'and '+ str(listu[x])
        else:
            y+= str(listu[x]) + ','
    
    Limit the number of iterations to len(listy) - 1 and add the last element outside the for-loop:
    def listsmash(listu):
        y = ''
        for x in range(len(listu) - 1):
            y += str(listu[x]) + ', '
        y += 'and ' + str(listu[-1])
        return y
    
  • Use str.join: str.join is a handy function in this case:
    def listsmash(listu):
        y = ', '.join(str(value) for value in listu[:-1])
        return y + ', and ' + str(listu[-1])
    
    It joins all elements of listu (except the last one) with , and then we can append the last element at the end. Additionally, the function .join() is faster than +=.
  • Naming: I am not sure what listu means, maybe you can consider a better name like items following from the problem description.
added 1073 characters in body
Source Link
Marc
  • 5.7k
  • 2
  • 14
  • 35
  • Indentation: the first line is not indented correctly, it won't compile as-is. Therethere is an extra tab or spaces before def listsmash(listu):.
  • Code formatting: follow PEP 8 to format the code. You can use pep8online or just use the auto-formatting feature of many IDEs.
  • Bug: the output should be apples, bananas, tofu, and cats but the code outputs apples,bananas,tofu,and cats. There should be a space after the comma.
  • Edge case: if the input list contains only apples the code outputs and apples. This is an edge case to handle, probably at the beginning of the method.
  • Performance: there is no much to worry about performances, as it runs linearly to the input size. However, the first if condition is executed everytime:
    for x in range(len(listu)):
        if x == len(listu) -1 :
            y+= 'and '+ str(listu[x])
        else:
            y+= str(listu[x]) + ','
    
    Limit the number of iterations to len(listy) - 1 and add the last element outside the for-loop:
    def listsmash(listu):
        y = ''
        for x in range(len(listu) - 1):
            y += str(listu[x]) + ', '
        y += 'and ' + str(listu[-1])
        return y
    
  • Use string.join: string.join is a handy function in this case:
    def listsmash(listu):
        y = ', '.join(str(value) for value in listu[:-1])
        return y + ', and ' + str(listu[-1])
    
    JoinsIt joins all elements of listu (except the last one) of listu with , and addthen we can append the last element at the end. Additionally, the function .join() is faster than +=.
  • Naming: I am not sure what listu means, maybe you can consider a better name like items following from the problem description.

Runtime for 1 million items:

Original: 4.321 s
Improved: 0.418 s

Full code:

from random import randint
from time import perf_counter


def original(listu):
    y = ''
    for x in range(len(listu)):
        if x == len(listu) - 1:
            y += 'and ' + str(listu[x])
        else:
            y += str(listu[x]) + ', '
    return y


def improved(items):
    result = ', '.join(str(item) for item in items[:-1])
    return result + ', and ' + str(items[-1])


# Correctness
items = ['apples', 'bananas', 'tofu']
assert original(items) == improved(items)

# Benchmark
n = 1_000_000
items = [randint(0, n) for _ in range(n)]

t0 = perf_counter()
original(items)
total_time = perf_counter() - t0
print(f'Original: {round(total_time, 3)} s')

t0 = perf_counter()
improved(items)
total_time = perf_counter() - t0
print(f'Improved: {round(total_time, 3)} s')
  • Indentation: the first line is not indented correctly, it won't compile as-is. There is an extra tab or spaces before def listsmash(listu):.
  • Code formatting: follow PEP 8 to format the code. You can use pep8online or just use the auto-formatting feature of many IDEs.
  • Bug: the output should be apples, bananas, tofu, and cats but the code outputs apples,bananas,tofu,and cats. There should be a space after the comma.
  • Edge case: if the input list contains only apples the code outputs and apples. This is an edge case to handle, probably at the beginning of the method.
  • Performance: there is no much to worry about performances, as it runs linearly to the input size. However, the first if condition is executed everytime:
    for x in range(len(listu)):
        if x == len(listu) -1 :
            y+= 'and '+ str(listu[x])
        else:
            y+= str(listu[x]) + ','
    
    Limit the number of iterations to len(listy) - 1 and add the last element outside the for-loop:
    def listsmash(listu):
        y = ''
        for x in range(len(listu) - 1):
            y += str(listu[x]) + ', '
        y += 'and ' + str(listu[-1])
        return y
    
  • Use string.join: string.join is a handy function in this case:
    def listsmash(listu):
        y = ', '.join(str(value) for value in listu[:-1])
        return y + ', and ' + str(listu[-1])
    
    Joins all elements (except the last one) of listu with , and add the last element at the end.
  • Naming: I am not sure what listu means, maybe you can consider a better name like items following from the problem description.
  • Indentation: the first line is not indented correctly, there is an extra tab or spaces before def listsmash(listu):.
  • Code formatting: follow PEP 8 to format the code. You can use pep8online or just use the auto-formatting feature of many IDEs.
  • Bug: the output should be apples, bananas, tofu, and cats but the code outputs apples,bananas,tofu,and cats. There should be a space after the comma.
  • Edge case: if the input list contains only apples the code outputs and apples. This is an edge case to handle, probably at the beginning of the method.
  • Performance: there is no much to worry about performances, as it runs linearly to the input size. However, the first if condition is executed everytime:
    for x in range(len(listu)):
        if x == len(listu) -1 :
            y+= 'and '+ str(listu[x])
        else:
            y+= str(listu[x]) + ','
    
    Limit the number of iterations to len(listy) - 1 and add the last element outside the for-loop:
    def listsmash(listu):
        y = ''
        for x in range(len(listu) - 1):
            y += str(listu[x]) + ', '
        y += 'and ' + str(listu[-1])
        return y
    
  • Use string.join: string.join is a handy function in this case:
    def listsmash(listu):
        y = ', '.join(str(value) for value in listu[:-1])
        return y + ', and ' + str(listu[-1])
    
    It joins all elements of listu (except the last one) with , and then we can append the last element at the end. Additionally, the function .join() is faster than +=.
  • Naming: I am not sure what listu means, maybe you can consider a better name like items following from the problem description.

Runtime for 1 million items:

Original: 4.321 s
Improved: 0.418 s

Full code:

from random import randint
from time import perf_counter


def original(listu):
    y = ''
    for x in range(len(listu)):
        if x == len(listu) - 1:
            y += 'and ' + str(listu[x])
        else:
            y += str(listu[x]) + ', '
    return y


def improved(items):
    result = ', '.join(str(item) for item in items[:-1])
    return result + ', and ' + str(items[-1])


# Correctness
items = ['apples', 'bananas', 'tofu']
assert original(items) == improved(items)

# Benchmark
n = 1_000_000
items = [randint(0, n) for _ in range(n)]

t0 = perf_counter()
original(items)
total_time = perf_counter() - t0
print(f'Original: {round(total_time, 3)} s')

t0 = perf_counter()
improved(items)
total_time = perf_counter() - t0
print(f'Improved: {round(total_time, 3)} s')
added 66 characters in body
Source Link
Marc
  • 5.7k
  • 2
  • 14
  • 35

Nice solution, these are my suggestions:

  • Indentation: the functionfirst line is not indented correctly, it won't compile as-is. There is an extra tab or spaces before def listsmash(listu):.
  • Code formatting: follow PEP 8 to format the code. You can use pep8online or just use the auto-formatting feature of many IDEs.
  • Bug: the output should be apples, bananas, tofu, and cats but the code outputs apples,bananas,tofu,and cats. There should be a space after the comma.
  • Edge case: if the input list contains only apples the code outputs and apples. This is an edge case to handle, probably at the beginning of the method.
  • Performance: there is no much to worry about performances, as it runs linearly to the input size. However, the first if condition is executed everytime:
    for x in range(len(listu)):
        if x == len(listu) -1 :
            y+= 'and '+ str(listu[x])
        else:
            y+= str(listu[x]) + ','
    
    Limit the number of iterations to len(listy) - 1 and add the last element outside the for-loop:
    def listsmash(listu):
        y = ''
        for x in range(len(listu) - 1):
            y += str(listu[x]) + ', '
        y += 'and ' + str(listu[-1])
        return y
    
  • Use string.join: string.join is a handy function in this case:
    def listsmash(listu):
        y = ', '.join(str(value) for value in listu[:-1])
        return y + ', and ' + str(listu[-1])
    
    Joins all elements (except the last one) of listu with , and add the last element at the end.
  • Naming: I am not sure what listu means, maybe you can consider a better name like items following from the problem description.

Nice solution, these are my suggestions:

  • Indentation: the function is not indented correctly, it won't compile as-is.
  • Code formatting: follow PEP 8 to format the code. You can use pep8online or just use the auto-formatting feature of many IDEs.
  • Bug: the output should be apples, bananas, tofu, and cats but the code outputs apples,bananas,tofu,and cats. There should be a space after the comma.
  • Edge case: if the input list contains only apples the code outputs and apples. This is an edge case to handle, probably at the beginning of the method.
  • Performance: there is no much to worry about performances, as it runs linearly to the input size. However, the first if condition is executed everytime:
    for x in range(len(listu)):
        if x == len(listu) -1 :
            y+= 'and '+ str(listu[x])
        else:
            y+= str(listu[x]) + ','
    
    Limit the number of iterations to len(listy) - 1 and add the last element outside the for-loop:
    def listsmash(listu):
        y = ''
        for x in range(len(listu) - 1):
            y += str(listu[x]) + ', '
        y += 'and ' + str(listu[-1])
        return y
    
  • Use string.join: string.join is a handy function in this case:
    def listsmash(listu):
        y = ', '.join(str(value) for value in listu[:-1])
        return y + ', and ' + str(listu[-1])
    
    Joins all elements (except the last one) of listu with , and add the last element at the end.
  • Naming: I am not sure what listu means, maybe you can consider a better name like items following from the problem description.

Nice solution, these are my suggestions:

  • Indentation: the first line is not indented correctly, it won't compile as-is. There is an extra tab or spaces before def listsmash(listu):.
  • Code formatting: follow PEP 8 to format the code. You can use pep8online or just use the auto-formatting feature of many IDEs.
  • Bug: the output should be apples, bananas, tofu, and cats but the code outputs apples,bananas,tofu,and cats. There should be a space after the comma.
  • Edge case: if the input list contains only apples the code outputs and apples. This is an edge case to handle, probably at the beginning of the method.
  • Performance: there is no much to worry about performances, as it runs linearly to the input size. However, the first if condition is executed everytime:
    for x in range(len(listu)):
        if x == len(listu) -1 :
            y+= 'and '+ str(listu[x])
        else:
            y+= str(listu[x]) + ','
    
    Limit the number of iterations to len(listy) - 1 and add the last element outside the for-loop:
    def listsmash(listu):
        y = ''
        for x in range(len(listu) - 1):
            y += str(listu[x]) + ', '
        y += 'and ' + str(listu[-1])
        return y
    
  • Use string.join: string.join is a handy function in this case:
    def listsmash(listu):
        y = ', '.join(str(value) for value in listu[:-1])
        return y + ', and ' + str(listu[-1])
    
    Joins all elements (except the last one) of listu with , and add the last element at the end.
  • Naming: I am not sure what listu means, maybe you can consider a better name like items following from the problem description.
deleted 14 characters in body
Source Link
Marc
  • 5.7k
  • 2
  • 14
  • 35
Loading
Source Link
Marc
  • 5.7k
  • 2
  • 14
  • 35
Loading