diff options
Diffstat (limited to 'Data_Structures_and_Algorithms_in_Java/ch12.ipynb')
-rw-r--r-- | Data_Structures_and_Algorithms_in_Java/ch12.ipynb | 412 |
1 files changed, 387 insertions, 25 deletions
diff --git a/Data_Structures_and_Algorithms_in_Java/ch12.ipynb b/Data_Structures_and_Algorithms_in_Java/ch12.ipynb index 8343fffc..1be785c9 100644 --- a/Data_Structures_and_Algorithms_in_Java/ch12.ipynb +++ b/Data_Structures_and_Algorithms_in_Java/ch12.ipynb @@ -1,6 +1,7 @@ { "metadata": { - "name": "ch12" + "name": "", + "signature": "sha256:f213ff4fe3150e369b8ba77a058a36b9c6a812a3ac3196b559e262346daafa7b" }, "nbformat": 3, "nbformat_minor": 0, @@ -11,102 +12,316 @@ "cell_type": "heading", "level": 1, "metadata": {}, - "source": "Chapter 12 : Heaps " + "source": [ + "Chapter 12 : Heaps " + ] }, { "cell_type": "heading", "level": 3, "metadata": {}, - "source": "Example 12.1 Page no : 592" + "source": [ + "Example 12.1 Page no : 592" + ] }, { "cell_type": "code", "collapsed": false, - "input": "'''\nexample 12.1\ndemonstrates heaps\n'''\n\nclass Node: \n def __init__(self,key):\n # constructorJava Code for Heaps\n self.iData = key\n \n def getKey(self):\n return self.iData\n\n def setKey(self,i):\n self.iData = i\n\nclass Heap:\n def __init__(self,mx):\n self.maxSize = mx\n self.currentSize = 0\n self.heapArray = []\n for i in range(self.maxSize):\n self.heapArray.append(Node(0))\n\n def isEmpty(self):\n return self.currentSize==0\n\n def insert(self,key):\n if(self.currentSize==self.maxSize):\n return False\n newNode = Node(key)\n self.heapArray[self.currentSize] = newNode\n self.trickleUp(self.currentSize)\n self.currentSize += 1\n return True\n\n def trickleUp(self,index):\n parent = (index-1) / 2\n bottom = self.heapArray[index]\n while( index > 0 and self.heapArray[parent].getKey() < bottom.getKey() ):\n self.heapArray[index] = self.heapArray[parent] # move it down\n index = parent\n parent = (parent-1) / 2\n self.heapArray[index] = bottom\n\n def remove(self): # delete item with max key\n # (assumes non-empty list)\n root = self.heapArray[0]\n self.currentSize -= 1\n self.heapArray[0] = self.heapArray[self.currentSize]\n self.trickleDown(0)\n return root\n\n def trickleDown(self,index):\n top = self.heapArray[index] # save root\n while(index < self.currentSize/2): # while node has at\n leftChild = 2*index+1\n rightChild = leftChild+1 # find larger child\n if(rightChild < self.currentSize and self.heapArray[leftChild].getKey() < self.heapArray[rightChild].getKey()):\n largerChild = rightChild\n else:\n largerChild = leftChild\n if( top.getKey() >= self.heapArray[largerChild].getKey() ):\n break\n # shift child up\n self.heapArray[index] = self.heapArray[largerChild]\n index = largerChild # go down\n\n self.heapArray[index] = top # root to indexJava Code for Heaps\n \n def change(self,index,newValue):\n if(index<0 or index>=self.currentSize):\n return False\n oldValue = self.heapArray[index].getKey() # remember old\n self.heapArray[index].setKey(newValue) # change to new\n if(oldValue < newValue): # if raised,\n trickleUp(index) # trickle it up\n else: # if lowered,\n trickleDown(index) # trickle it down\n return True\n\n def displayHeap(self):\n print 'self.heapArray: ', # array format\n for m in range(self.currentSize):\n if(self.heapArray[m] != None):\n print self.heapArray[m].getKey(),\n else:\n print '-- ' ,\n print ''\n nBlanks = 32\n itemsPerRow = 1\n column = 0\n j = 0\n # current item\n dots = '...............................'\n print dots+dots\n # dotted top line\n while(self.currentSize > 0):\n if(column == 0):\n for k in range(nBlanks):\n print ' ' ,\n print self.heapArray[j].getKey() ,\n j += 1 \n if(j == self.currentSize):\n break # done?\n column += 1\n if(column==itemsPerRow): # end of row?\n nBlanks /= 2 # half the blanks\n itemsPerRow *= 2 # twice the items\n column = 0 # start over on\n print ''\n else: # next item on row\n for k in range(nBlanks*2-2):\n print ' ', # interim blanks\n print '\\n' +dots+dots \n\ntheHeap = Heap(31) # make a Heap max size 31\ntheHeap.insert(70)\ntheHeap.insert(40)\ntheHeap.insert(50)\ntheHeap.insert(20)\ntheHeap.insert(60)\ntheHeap.insert(100)\ntheHeap.insert(80)\ntheHeap.insert(30)\ntheHeap.insert(10)\ntheHeap.insert(90)\nwhile(True):\n print 'Enter first letter of show, insert, remove, change: ',\n choice = raw_input()\n if choice == 's':\n theHeap.displayHeap()\n elif choice == 'i':\n print 'Enter value to key to insert: '\n value = int(raw_input())\n success = theHeap.insert(value)\n if not success:\n print \"Can't insert heap full\"\n elif choice == 'f':\n print 'Enter key value to find: ',\n value = int(raw_input())\n aDataItem = theHashTable.find(aKey)\n if(aDataItem != None):\n print 'Found ' , aKey\n else:\n print 'Could not find ' , aKey\n elif choice=='r':\n if not theHeap.isEmpty():\n theHeap.remove()\n else:\n print \"Can't remove heap empty\"\n elif choice=='c':\n print 'Enter current index of item: ',\n value = int(raw_input())\n print \"Enter new key: \",\n value2 = int(raw_input())\n success = theHeap.change(value, value2)\n if( not success ):\n print 'Invalid index'\n else:\n print \"Invalid entry\"\n break ", + "input": [ + " \n", + "class Node: \n", + " def __init__(self,key):\n", + " # constructorJava Code for Heaps\n", + " self.iData = key\n", + " \n", + " def getKey(self):\n", + " return self.iData\n", + "\n", + " def setKey(self,i):\n", + " self.iData = i\n", + "\n", + "class Heap:\n", + " def __init__(self,mx):\n", + " self.maxSize = mx\n", + " self.currentSize = 0\n", + " self.heapArray = []\n", + " for i in range(self.maxSize):\n", + " self.heapArray.append(Node(0))\n", + "\n", + " def isEmpty(self):\n", + " return self.currentSize==0\n", + "\n", + " def insert(self,key):\n", + " if(self.currentSize==self.maxSize):\n", + " return False\n", + " newNode = Node(key)\n", + " self.heapArray[self.currentSize] = newNode\n", + " self.trickleUp(self.currentSize)\n", + " self.currentSize += 1\n", + " return True\n", + "\n", + " def trickleUp(self,index):\n", + " parent = (index-1) / 2\n", + " bottom = self.heapArray[index]\n", + " while( index > 0 and self.heapArray[parent].getKey() < bottom.getKey() ):\n", + " self.heapArray[index] = self.heapArray[parent] # move it down\n", + " index = parent\n", + " parent = (parent-1) / 2\n", + " self.heapArray[index] = bottom\n", + "\n", + " def remove(self): # delete item with max key\n", + " # (assumes non-empty list)\n", + " root = self.heapArray[0]\n", + " self.currentSize -= 1\n", + " self.heapArray[0] = self.heapArray[self.currentSize]\n", + " self.trickleDown(0)\n", + " return root\n", + "\n", + " def trickleDown(self,index):\n", + " top = self.heapArray[index] # save root\n", + " while(index < self.currentSize/2): # while node has at\n", + " leftChild = 2*index+1\n", + " rightChild = leftChild+1 # find larger child\n", + " if(rightChild < self.currentSize and self.heapArray[leftChild].getKey() < self.heapArray[rightChild].getKey()):\n", + " largerChild = rightChild\n", + " else:\n", + " largerChild = leftChild\n", + " if( top.getKey() >= self.heapArray[largerChild].getKey() ):\n", + " break\n", + " # shift child up\n", + " self.heapArray[index] = self.heapArray[largerChild]\n", + " index = largerChild # go down\n", + "\n", + " self.heapArray[index] = top # root to indexJava Code for Heaps\n", + " \n", + " def change(self,index,newValue):\n", + " if(index<0 or index>=self.currentSize):\n", + " return False\n", + " oldValue = self.heapArray[index].getKey() # remember old\n", + " self.heapArray[index].setKey(newValue) # change to new\n", + " if(oldValue < newValue): # if raised,\n", + " trickleUp(index) # trickle it up\n", + " else: # if lowered,\n", + " trickleDown(index) # trickle it down\n", + " return True\n", + "\n", + " def displayHeap(self):\n", + " print 'self.heapArray: ', # array format\n", + " for m in range(self.currentSize):\n", + " if(self.heapArray[m] != None):\n", + " print self.heapArray[m].getKey(),\n", + " else:\n", + " print '-- ' ,\n", + " print ''\n", + " nBlanks = 32\n", + " itemsPerRow = 1\n", + " column = 0\n", + " j = 0\n", + " # current item\n", + " dots = '...............................'\n", + " print dots+dots\n", + " # dotted top line\n", + " while(self.currentSize > 0):\n", + " if(column == 0):\n", + " for k in range(nBlanks):\n", + " print ' ' ,\n", + " print self.heapArray[j].getKey() ,\n", + " j += 1 \n", + " if(j == self.currentSize):\n", + " break # done?\n", + " column += 1\n", + " if(column==itemsPerRow): # end of row?\n", + " nBlanks /= 2 # half the blanks\n", + " itemsPerRow *= 2 # twice the items\n", + " column = 0 # start over on\n", + " print ''\n", + " else: # next item on row\n", + " for k in range(nBlanks*2-2):\n", + " print ' ', # interim blanks\n", + " print '\\n' +dots+dots \n", + "\n", + "theHeap = Heap(31) # make a Heap max size 31\n", + "theHeap.insert(70)\n", + "theHeap.insert(40)\n", + "theHeap.insert(50)\n", + "theHeap.insert(20)\n", + "theHeap.insert(60)\n", + "theHeap.insert(100)\n", + "theHeap.insert(80)\n", + "theHeap.insert(30)\n", + "theHeap.insert(10)\n", + "theHeap.insert(90)\n", + "while(True):\n", + " print 'Enter first letter of show, insert, remove, change: ',\n", + " choice = raw_input()\n", + " if choice == 's':\n", + " theHeap.displayHeap()\n", + " elif choice == 'i':\n", + " print 'Enter value to key to insert: '\n", + " value = int(raw_input())\n", + " success = theHeap.insert(value)\n", + " if not success:\n", + " print \"Can't insert heap full\"\n", + " elif choice == 'f':\n", + " print 'Enter key value to find: ',\n", + " value = int(raw_input())\n", + " aDataItem = theHashTable.find(aKey)\n", + " if(aDataItem != None):\n", + " print 'Found ' , aKey\n", + " else:\n", + " print 'Could not find ' , aKey\n", + " elif choice=='r':\n", + " if not theHeap.isEmpty():\n", + " theHeap.remove()\n", + " else:\n", + " print \"Can't remove heap empty\"\n", + " elif choice=='c':\n", + " print 'Enter current index of item: ',\n", + " value = int(raw_input())\n", + " print \"Enter new key: \",\n", + " value2 = int(raw_input())\n", + " success = theHeap.change(value, value2)\n", + " if( not success ):\n", + " print 'Invalid index'\n", + " else:\n", + " print \"Invalid entry\"\n", + " break " + ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", - "text": " Enter first letter of show, insert, remove, change: " + "text": [ + " Enter first letter of show, insert, remove, change: " + ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", - "text": "s\n" + "text": [ + "s\n" + ] }, { "output_type": "stream", "stream": "stdout", - "text": " self.heapArray: 100 90 80 30 60 50 70 20 10 40 \n..............................................................\n 100 \n 90 80 \n 30 60 50 70 \n 20 10 40 \n..............................................................\nEnter first letter of show, insert, remove, change: " + "text": [ + " self.heapArray: 100 90 80 30 60 50 70 20 10 40 \n", + "..............................................................\n", + " 100 \n", + " 90 80 \n", + " 30 60 50 70 \n", + " 20 10 40 \n", + "..............................................................\n", + "Enter first letter of show, insert, remove, change: " + ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", - "text": "i\n" + "text": [ + "i\n" + ] }, { "output_type": "stream", "stream": "stdout", - "text": " Enter value to key to insert: \n" + "text": [ + " Enter value to key to insert: \n" + ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", - "text": "53\n" + "text": [ + "53\n" + ] }, { "output_type": "stream", "stream": "stdout", - "text": "Enter first letter of show, insert, remove, change: " + "text": [ + "Enter first letter of show, insert, remove, change: " + ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", - "text": "s\n" + "text": [ + "s\n" + ] }, { "output_type": "stream", "stream": "stdout", - "text": " self.heapArray: 100 90 80 30 60 50 70 20 10 40 53 \n..............................................................\n 100 \n 90 80 \n 30 60 50 70 \n 20 10 40 53 \n..............................................................\nEnter first letter of show, insert, remove, change: " + "text": [ + " self.heapArray: 100 90 80 30 60 50 70 20 10 40 53 \n", + "..............................................................\n", + " 100 \n", + " 90 80 \n", + " 30 60 50 70 \n", + " 20 10 40 53 \n", + "..............................................................\n", + "Enter first letter of show, insert, remove, change: " + ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", - "text": "r\n" + "text": [ + "r\n" + ] }, { "output_type": "stream", "stream": "stdout", - "text": " Enter first letter of show, insert, remove, change: " + "text": [ + " Enter first letter of show, insert, remove, change: " + ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", - "text": "s\n" + "text": [ + "s\n" + ] }, { "output_type": "stream", "stream": "stdout", - "text": " self.heapArray: 90 60 80 30 53 50 70 20 10 40 \n..............................................................\n 90 \n 60 80 \n 30 53 50 70 \n 20 10 40 \n..............................................................\nEnter first letter of show, insert, remove, change: " + "text": [ + " self.heapArray: 90 60 80 30 53 50 70 20 10 40 \n", + "..............................................................\n", + " 90 \n", + " 60 80 \n", + " 30 53 50 70 \n", + " 20 10 40 \n", + "..............................................................\n", + "Enter first letter of show, insert, remove, change: " + ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", - "text": "\n" + "text": [ + "\n" + ] }, { "output_type": "stream", "stream": "stdout", - "text": " Invalid entry\n" + "text": [ + " Invalid entry\n" + ] } ], "prompt_number": 2 @@ -115,30 +330,177 @@ "cell_type": "heading", "level": 3, "metadata": {}, - "source": "Example 12.2 Page no : 605" + "source": [ + "Example 12.2 Page no : 605" + ] }, { "cell_type": "code", "collapsed": false, - "input": "'''\nexample 12.2\ndemonstrates heap sort\n'''\nclass Node: \n def __init__(self,key):\n # constructorJava Code for Heaps\n self.iData = key\n \n def getKey(self):\n return self.iData\n\n def setKey(self,i):\n self.iData = i\n\nclass Heap:\n def __init__(self,mx):\n self.maxSize = mx\n self.currentSize = 0\n self.heapArray = []\n for i in range(self.maxSize):\n self.heapArray.append(Node(0))\n\n def isEmpty(self):\n return self.currentSize==0\n\n def insert(self,key):\n if(self.currentSize==self.maxSize):\n return False\n newNode = Node(key)\n self.heapArray[self.currentSize] = newNode\n self.trickleUp(self.currentSize)\n self.currentSize += 1\n return True\n\n def remove(self): # delete item with max key\n # (assumes non-empty list)\n root = self.heapArray[0]\n self.currentSize -= 1\n self.heapArray[0] = self.heapArray[self.currentSize]\n self.trickleDown(0)\n return root\n\n def trickleDown(self,index):\n top = self.heapArray[index] # save root\n while(index < self.currentSize/2): # while node has at\n leftChild = 2*index+1\n rightChild = leftChild+1 # find larger child\n if(rightChild < self.currentSize and self.heapArray[leftChild].getKey() < self.heapArray[rightChild].getKey()):\n largerChild = rightChild\n else:\n largerChild = leftChild\n if( top.getKey() >= self.heapArray[largerChild].getKey() ):\n break\n # shift child up\n self.heapArray[index] = self.heapArray[largerChild]\n index = largerChild # go down\n self.heapArray[index] = top # root to indexJava Code for Heaps\n\n def displayHeap(self):\n print 'self.heapArray: ', # array format\n for m in range(self.currentSize):\n if(self.heapArray[m] != None):\n print self.heapArray[m].getKey(),\n else:\n print '-- ' ,\n print ''\n nBlanks = 32\n itemsPerRow = 1\n column = 0\n j = 0\n # current item\n dots = '...............................'\n print dots+dots\n # dotted top line\n while(self.currentSize > 0):\n if(column == 0):\n for k in range(nBlanks):\n print ' ' ,\n print self.heapArray[j].getKey() ,\n j += 1 \n if(j == self.currentSize):\n break # done?\n column += 1\n if(column==itemsPerRow): # end of row?\n nBlanks /= 2 # half the blanks\n itemsPerRow *= 2 # twice the items\n column = 0 # start over on\n print ''\n else: # next item on row\n for k in range(nBlanks*2-2):\n print ' ', # interim blanks\n print '\\n' +dots+dots \n \n def displayArray(self):\n for j in range(self.maxSize):\n print self.heapArray[j].getKey() ,\n print ''\n\n def insertAt(self,index,newNode):\n self.heapArray[index] = newNode\n\n def incrementSize(self):\n self.currentSize += 1\n\n\nprint 'Enter number of items: ',\nsize = int(raw_input())\ntheHeap = Heap(size)\nimport random\nfor j in range(size): # fill array with\n r = int(random.random()*100)\n newNode = Node(r)\n theHeap.insertAt(j, newNode)\n theHeap.incrementSize()\nprint 'Random: ',\ntheHeap.displayArray() # display random array\nj = size/2 - 1\nwhile j >= 0:\n theHeap.trickleDown(j)\n j -= 1\nprint 'Heap: ',\ntheHeap.displayArray()\ntheHeap.displayHeap()\nj = size - 1\nwhile j >= 0:\n biggestNode = theHeap.remove()\n theHeap.insertAt(j, biggestNode)\n j -= 1\n \nprint 'Sorted: ',\ntheHeap.displayArray()", + "input": [ + " \n", + "class Node: \n", + " def __init__(self,key):\n", + " # constructorJava Code for Heaps\n", + " self.iData = key\n", + " \n", + " def getKey(self):\n", + " return self.iData\n", + "\n", + " def setKey(self,i):\n", + " self.iData = i\n", + "\n", + "class Heap:\n", + " def __init__(self,mx):\n", + " self.maxSize = mx\n", + " self.currentSize = 0\n", + " self.heapArray = []\n", + " for i in range(self.maxSize):\n", + " self.heapArray.append(Node(0))\n", + "\n", + " def isEmpty(self):\n", + " return self.currentSize==0\n", + "\n", + " def insert(self,key):\n", + " if(self.currentSize==self.maxSize):\n", + " return False\n", + " newNode = Node(key)\n", + " self.heapArray[self.currentSize] = newNode\n", + " self.trickleUp(self.currentSize)\n", + " self.currentSize += 1\n", + " return True\n", + "\n", + " def remove(self): # delete item with max key\n", + " # (assumes non-empty list)\n", + " root = self.heapArray[0]\n", + " self.currentSize -= 1\n", + " self.heapArray[0] = self.heapArray[self.currentSize]\n", + " self.trickleDown(0)\n", + " return root\n", + "\n", + " def trickleDown(self,index):\n", + " top = self.heapArray[index] # save root\n", + " while(index < self.currentSize/2): # while node has at\n", + " leftChild = 2*index+1\n", + " rightChild = leftChild+1 # find larger child\n", + " if(rightChild < self.currentSize and self.heapArray[leftChild].getKey() < self.heapArray[rightChild].getKey()):\n", + " largerChild = rightChild\n", + " else:\n", + " largerChild = leftChild\n", + " if( top.getKey() >= self.heapArray[largerChild].getKey() ):\n", + " break\n", + " # shift child up\n", + " self.heapArray[index] = self.heapArray[largerChild]\n", + " index = largerChild # go down\n", + " self.heapArray[index] = top # root to indexJava Code for Heaps\n", + "\n", + " def displayHeap(self):\n", + " print 'self.heapArray: ', # array format\n", + " for m in range(self.currentSize):\n", + " if(self.heapArray[m] != None):\n", + " print self.heapArray[m].getKey(),\n", + " else:\n", + " print '-- ' ,\n", + " print ''\n", + " nBlanks = 32\n", + " itemsPerRow = 1\n", + " column = 0\n", + " j = 0\n", + " # current item\n", + " dots = '...............................'\n", + " print dots+dots\n", + " # dotted top line\n", + " while(self.currentSize > 0):\n", + " if(column == 0):\n", + " for k in range(nBlanks):\n", + " print ' ' ,\n", + " print self.heapArray[j].getKey() ,\n", + " j += 1 \n", + " if(j == self.currentSize):\n", + " break # done?\n", + " column += 1\n", + " if(column==itemsPerRow): # end of row?\n", + " nBlanks /= 2 # half the blanks\n", + " itemsPerRow *= 2 # twice the items\n", + " column = 0 # start over on\n", + " print ''\n", + " else: # next item on row\n", + " for k in range(nBlanks*2-2):\n", + " print ' ', # interim blanks\n", + " print '\\n' +dots+dots \n", + " \n", + " def displayArray(self):\n", + " for j in range(self.maxSize):\n", + " print self.heapArray[j].getKey() ,\n", + " print ''\n", + "\n", + " def insertAt(self,index,newNode):\n", + " self.heapArray[index] = newNode\n", + "\n", + " def incrementSize(self):\n", + " self.currentSize += 1\n", + "\n", + "\n", + "print 'Enter number of items: ',\n", + "size = int(raw_input())\n", + "theHeap = Heap(size)\n", + "import random\n", + "for j in range(size): # fill array with\n", + " r = int(random.random()*100)\n", + " newNode = Node(r)\n", + " theHeap.insertAt(j, newNode)\n", + " theHeap.incrementSize()\n", + "print 'Random: ',\n", + "theHeap.displayArray() # display random array\n", + "j = size/2 - 1\n", + "while j >= 0:\n", + " theHeap.trickleDown(j)\n", + " j -= 1\n", + "print 'Heap: ',\n", + "theHeap.displayArray()\n", + "theHeap.displayHeap()\n", + "j = size - 1\n", + "while j >= 0:\n", + " biggestNode = theHeap.remove()\n", + " theHeap.insertAt(j, biggestNode)\n", + " j -= 1\n", + " \n", + "print 'Sorted: ',\n", + "theHeap.displayArray()" + ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", - "text": "Enter number of items: " + "text": [ + "Enter number of items: " + ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", - "text": "10\n" + "text": [ + "10\n" + ] }, { "output_type": "stream", "stream": "stdout", - "text": " Random: 21 55 43 65 70 16 47 22 51 73 \nHeap: 73 70 47 65 55 16 43 22 51 21 \nself.heapArray: 73 70 47 65 55 16 43 22 51 21 \n..............................................................\n 73 \n 70 47 \n 65 55 16 43 \n 22 51 21 \n..............................................................\nSorted: 16 21 22 43 47 51 55 65 70 73 \n" + "text": [ + " Random: 21 55 43 65 70 16 47 22 51 73 \n", + "Heap: 73 70 47 65 55 16 43 22 51 21 \n", + "self.heapArray: 73 70 47 65 55 16 43 22 51 21 \n", + "..............................................................\n", + " 73 \n", + " 70 47 \n", + " 65 55 16 43 \n", + " 22 51 21 \n", + "..............................................................\n", + "Sorted: 16 21 22 43 47 51 55 65 70 73 \n" + ] } ], "prompt_number": 3 @@ -146,7 +508,7 @@ { "cell_type": "code", "collapsed": false, - "input": "", + "input": [], "language": "python", "metadata": {}, "outputs": [] |