liv2hak
liv2hak

Reputation: 14990

tabulate package TypeError: 'float object is not iterable'

I have the following program that uses a deque that I copied from the web.

from collections import Counter,deque
import re
import time
import my_ds

num = 100000

def append(c):
    for i in range(num):
        c.append(i)

def appendleft(c):
    if isinstance(c, deque):
        for i in range(num):
            c.appendleft(i)
    else:
        for i in range(num):
            c.insert(0,i)

def pop(c):
    for i in range(num):
        c.pop()

def popleft(c):
    if isinstance(c,deque):
        for i in range(num):
            c.popleft()
    else:
        for i in range(num):
            c.pop(0)


for container in [deque, list]:
    for operation in [append, appendleft, pop, popleft]:
        c = container(range(num))
        start = time.time()
        operation(c)
        elapsed = time.time() - start
        print('Completed {0}/{1}       in {2} seconds: {3} ops/sec'.format(container.__name__,operation.__name__, elapsed, num/elapsed))

The output looks like below.

Completed deque/append       in 0.011004447937011719 seconds: 9087234.595718866 ops/sec
Completed deque/appendleft       in 0.00800323486328125 seconds: 12494947.56911344 ops/sec
Completed deque/pop       in 0.00800323486328125 seconds: 12494947.56911344 ops/sec
Completed deque/popleft       in 0.009003400802612305 seconds: 11106914.175250906 ops/sec
Completed list/append       in 0.011004447937011719 seconds: 9087234.595718866 ops/sec
Completed list/appendleft       in 8.727489709854126 seconds: 11458.048456601553 ops/sec
Completed list/pop       in 0.01900768280029297 seconds: 5261030.555416185 ops/sec
Completed list/popleft       in 1.781712532043457 seconds: 56125.776858800775 ops/sec

I am looking for a nice way to align the numbers seconds and ops/second.How is this done in pythonI have the following program that uses a deque that I copied from the web.

from collections import Counter,deque
import re
import time
import my_ds

num = 100000

def append(c):
    for i in range(num):
        c.append(i)

def appendleft(c):
    if isinstance(c, deque):
        for i in range(num):
            c.appendleft(i)
    else:
        for i in range(num):
            c.insert(0,i)

def pop(c):
    for i in range(num):
        c.pop()

def popleft(c):
    if isinstance(c,deque):
        for i in range(num):
            c.popleft()
    else:
        for i in range(num):
            c.pop(0)


for container in [deque, list]:
    for operation in [append, appendleft, pop, popleft]:
        c = container(range(num))
        start = time.time()
        operation(c)
        elapsed = time.time() - start
        print_list = [container.__name__,operation.__name__, elapsed, num/elapsed]
        print(tabulate(print_list, headers = ['Container , Operation , Tile elapsed , ops/sec'], floatfmt=".8f"))

I am getting the following error.

Traceback (most recent call last):
  File "C:/playpen/python/concepts/data_structures/collections.py", line 66, in <module>
    print(tabulate(print_list, headers = ['Container , Operation , Tile elapsed , ops/sec'], floatfmt=".8f"))
  File "C:\Anaconda3\lib\site-packages\tabulate.py", line 894, in tabulate
    list_of_lists, headers = _normalize_tabular_data(tabular_data, headers)
  File "C:\Anaconda3\lib\site-packages\tabulate.py", line 649, in _normalize_tabular_data
    rows = list(map(list,rows))
TypeError: 'float' object is not iterable

Upvotes: 1

Views: 1509

Answers (1)

viraptor
viraptor

Reputation: 34175

You need to collect all the results and then print them in one go:

print_list = []
for container in [deque, list]:
    for operation in [append, appendleft, pop, popleft]:
        c = container(range(num))
        start = time.time()
        operation(c)
        elapsed = time.time() - start
        print_list.append([container.__name__,operation.__name__, elapsed, num/elapsed])
print(tabulate(print_list, headers = ['Container , Operation , Tile elapsed , ops/sec'], floatfmt=".8f"))

tabulate takes a list of rows (which should be lists of values). Your old version tried to iterate the numeric result.

Upvotes: 2

Related Questions