1,760
edits
Changes
no edit summary
<font color='red'>
'''** DO NOT USE - TO BE UPDATED FOR CENTOS 8.0 **'''
</font>
= OBJECTIVES =
:The '''first investigation''' in this lab will focus on '''Data Structures'''. Each data structure has its own advantages and limitations. This lab will emphasize the most important differences between them. :The '''second investigation''' will focus on strings. You have been using and storing strings since our first class, however in this lab we will dive into the more complex nature of string manipulation. Finally, this lab will cover how to use a variety of regular expression functions for searching and input validation. === PYTHON REFERENCE === :As you develop your Python scripting skills, you may start to be "overwhelmed" with the volume of information that you have absorbed over these labs. One way to help is to learn to use online references effectively in order to obtain information regarding Python scripting techniques and tools. :Below is a table with links to useful online Python Reference reference sites (by category). You may find these references useful when performing assignments, etc. {| class="wikitable" | style="margin-left:20px; border: 2px solid black;"|- style="border: 2px solid black;font-weight:bold;text-align:center;"| style="border: 2px solid black;" | Data Structures | style="border: 2px solid black;" | Lists & List Comprehension| style="border: 2px solid black;" | Strings| style="border: 2px solid black;" | Regular Expressions| style="border: 2px solid black;" | Miscellaneous |- style="background-color:white;border:none;"| style="border: 2px solid black;" valign="top"| :*[https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences Tuples]:*[https://docs.python.org/3/tutorial/datastructures.html#sets Sets]| style="border: 2px solid black;" | :*[https://docs.python.org/3/tutorial/introduction.html#lists Lists]:*[https://docs.python.org/3/tutorial/datastructures.html#more-on-lists More on Lists]:*[https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions List Comprehensions]| style="border: 2px solid black;" valign="top"| :*[https://docs.python.org/3/tutorial/introduction.html#strings Strings]:*[https://docs.python.org/3/library/string.html String Comparisons]| style="border: 2px solid black;" valign="top"| :*[https://docs.python.org/3/library/re.html Regular Expression Operations]:*[https://docs.python.org/3/howto/regex.html Regular Expressions (HOWTO)]| style="border: 2px solid black;" valign="top"| :*[https://docs.python.org/3/tutorial/datastructures.html#dictionaries Dictionaries] |}
= INVESTIGATION 1: DATA STRUCTURES =
for item in t1:
print('item: ' + item)
</presource>
== PART 2 - Set Sets ==Sets are another very similar structure to lists, they can also be modified and changed, unlike the tuple. But sets have two unique characteristics, they are unordered, and they cannot have duplicate values. The unordered part provides a added performance from hashing the values, but also means we cannot pull out a specific value at a spefici position. Any duplicate entries will immediately be deleted. Sets however are great tools for doing comparisons, finding differences in multiple sets, or finding similarities. The best part about sets are, they are fast!
s1 = {'Prime', 'Ix', 'Secundus', 'Caladan'}
s2 = {1, 2, 3, 4, 5}
s3 = {4, 5, 6, 7, 8}
</presource>Note: '''Sets are defined by using braces { }''' as opposed to tuples which use parenthesis ( ), or lists which use square brackets [ ]'''<br /><br />:#Try to access a set through the index:<source lang="python">print(s1[0])</source>This should have caused an '''error'''. You cannot access data inside a set this way because the elements inside are '''unordered'''. Instead, you should use the '''in''' method to check to see whether a value is contained in the set:<source lang="python">print('Ix' in s1)print('Geidi' in s1)</source><br>'''Sets can be combined''', but it is important to note that any '''duplicate values (shared among sets) will be deleted'''.<br><br>:#Print the contents of the sets and note the values that are common:<source lang="python">print(s2)print(s3)</source>:#This is how you get a set containing only UNIQUE values (no duplicates) from both sets:<source>print(s2 | s3) # returns a set containing all values from both setsprint(s2.union(s3)) # same as s2 | s3</source>Notice that both methods above have the same result, which one you choose depends purely on your style.<br><br>Instead of combining sets, we can display '''values that are common to both sets'''. This is known in mathematical terms as an '''intersection''' between the lists:<source lang="python">print(s2 & s3) # returns a set containing all values that s2 and s3 shareprint(s2.intersection(s3)) # same as s2 & s3</source>:#Sets can also have their values compared against other sets. First find out what items are in '''s2''' but not in '''s3'''. This is also called a '''difference''':<source lang="python">print(s2)print(s3)print(s2 - s3) # returns a set containing all values in s2 that are not found in s3print(s2.difference(s3)) # same as s2 - s3</source>:#In order to see <u>every</u> difference between both sets, you need to find the '''symmetric difference'''. This will return a set that shows all numbers that both sets do not share together:<source lang="python">print(s2 ^ s3) # returns a set containing all values that both sets DO NOT shareprint(s2.symmetric_difference(s3)) # same as s2 ^ s3</source>Note: the '''set()''' function can convert lists into sets, and the '''list()''' function can convert sets into lists. The operations in this section can only be applied to sets, so if you need to perform a union, intersection, or difference between lists, you need to convert them to sets first. For example:<source lang="python">l2 = [1, 2, 3, 4, 5]l3 = [4, 5, 6, 7, 8]temporary_set = set(l2).intersection(set(l3))new_list = list(temporary_set) # '''set()''' can make lists into sets. '''list()''' can make sets into lists.print(new_list)</source> === Create a Python Script Demonstrating Comparing Sets ===:'''Perform the Following Instructions''':#Create the '''~/ops435/lab4/lab4a.py''' script. The purpose of this script will be to demonstrate the different way of comparing sets. There will be three functions, each returning a different set comparison. :#Use the following template to get started:<source lang="python">#!/usr/bin/env python3 def join_sets(s1, s2): # join_sets will return a set that contains every value from both s1 and s2 def match_sets(s1, s2): # match_sets will return a set that contains all values found in both s1 and s2 def diff_sets(s1, s2): # diff_sets will return a set that contains all different values which are not shared between the sets if __name__ == '__main__': set1 = set(range(1,10)) set2 = set(range(5,15)) print('set1: ', set1) print('set2: ', set2) print('join: ', join_sets(set1, set2)) print('match: ', match_sets(set1, set2)) print('diff: ', diff_sets(set1, set2)) </source> ::*The join_sets() function should return a set that contains all values from both sets::*The match_sets() function should return a set that contains all values found in both sets::*The diff_sets() function should return a set that contains all values which are not shared between both sets::*All three functions should accept '''two arguments''' both are sets::*The script should show the exact output as the samples::*The script should contain no errors :::'''Sample Run 1:'''<source>./lab4a.pyset1: {1, 2, 3, 4, 5, 6, 7, 8, 9}set2: {5, 6, 7, 8, 9, 10, 11, 12, 13, 14}join: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}match: {8, 9, 5, 6, 7}diff: {1, 2, 3, 4, 10, 11, 12, 13, 14}</source>:::'''Sample Run 2 (with import):'''<source>import lab4aset1 = {1,2,3,4,5}set2 = {2,1,0,-1,-2}print(lab4a.join_sets(set1,set2))# Will output {-2, -1, 0, 1, 2, 3, 4, 5}print(lab4a.match_sets(set1,set2))# Will output {1, 2}print(lab4a.diff_sets(set1,set2))# Will output {-2, -1, 0, 3, 4, 5}</source><ol><li value='3' style="margin-left:25px;">Download the checking script and check your work. Enter the following commands from the bash shell:<source lang="bash">cd ~/ops435/lab4/pwd #confirm that you are in the right directoryls CheckLab4.py || wget https://raw.githubusercontent.com/Seneca-CDOT/ops435/master/LabCheckScripts/CheckLab4.pypython3 ./CheckLab4.py -f -v lab4a</source></li><li style="margin-left:25px;">Before proceeding, make certain that you identify all errors in lab4a.py. When the checking script tells you everything is OK - proceed to the next step.</li></ol>
if __name__ == '__main__':
list1 = list(range(1,10))
list2 = list(range(5,15))
print('list1: ', list1)
print('list2: ', list2)
print('join: ', join_lists(list1, list2))
print('match: ', match_lists(list1, list2))
print('diff: ', diff_lists(list1, list2))
</source>
::*The match_lists() function should return a list that contains all values found in both lists
::*The diff_lists() function should return a list that contains all values which are not shared between both lists
::*The join_lists() function should return a list that contains all values from both lists
::*All three functions should accept '''two arguments''' both are lists
::*The script should show the exact output as the samples
::*The script should contain no errors
:::'''Sample Run 1:'''<source>
./lab4b.py
list1: [1, 2, 3, 4, 5, 6, 7, 8, 9]
list2: [5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
join: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
match: [5, 6, 7, 8, 9]
diff: [1, 2, 3, 4, 10, 11, 12, 13, 14]
</source>
if __name__ == PART 3 - Dictionary '__main__': york =create_dictionary(list_keys, list_values) print('York: ', york) common =shared_values(dict_york, dict_newnham) print('Shared Values', common)</source>
:::*The script should contain '''two''' functions::::::'''create_dictionary()'''<ol><li>'''accepts''' two lists as arguments keys and values, '''combines''' these lists together to '''create''' a dictionary<br>('''Tip:''' use a while loop to access elements in both the keys and values lists at the same time)</li><li>'''returns a dictionary''' that has the keys and associated values from the lists</li></ol>:::::'''shared_values()''' <ol><li>'''accepts''' two dictionaries as arguments and '''finds''' all values that are shared between the two dictionaries<br>('''Tip:''' generate sets containing only values for each dictionary, then use a function mentioned in a previous section to store the values that are common to <u>both</u> lists)</li><li>'''returns a set''' containing '''ONLY values''' found in '''BOTH dictionaries'''</li></ol>:::*make sure the functions have the correct number of arguments required:::*The script should show the exact output as the samples:::*The script should contain no errors::::'''Sample Run 1:'''<source>./lab4c.pyYork: {'Country': 'Canada', 'Postal Code': 'M3J3M6', 'Address': '70 The Pond Rd', 'Province': 'ON', 'City': 'Toronto'}Shared Values {'Canada', 'ON', 'Toronto'}</source>::::'''Sample Run 2 (with import):'''<source>import lab4cdict_york ={'Address': '70 The Pond Rd', 'City': 'Toronto', 'Country': 'Canada', 'Postal Code': 'M3J3M6', 'Province': 'ON'}dict_newnham = PART 4 - List Comprehension {'Address': '1750 Finch Ave E', 'City': 'Toronto', 'Country': 'Canada', 'Postal Code': 'M2J2X5', 'Province': 'ON'}list_keys =['Address', 'City', 'Country', 'Postal Code', 'Province']list_values =['70 The Pond Rd', 'Toronto', 'Canada', 'M3J3M6', 'ON']
:'''Perform the Following Steps:'''
:#Create some strings in a temporary Python file:<source lang="python">
course_name = 'Open System Automation'
course_code = 'OPS435'
course_number = 435
</source>Strings can contain any '''characters''' inside them, whether they are '''letters''', '''numbers''', or '''symbols'''.
:#Strings can also be '''concatenated''' (i.e. "combined together") by using the '''+''' sign, just make sure string are only concatenating strings with strings (no lists, no numbers, no dictionaries, etc.):<source lang="python">
print(course_name)
print(course_code)
print(str(course_number))
print(course_name + ' ' + course_code + ' ' + str(course_number))
</source>When using the '''print()''' function, you can display '''special characters'''. One such special character is the is the newline character (denoted by the symbol: '''\n'''). This allows you to separate content between new lines or empty lines:<source lang="python">
print('Line 1\nLine 2\nLine 3\n')
</source>
:#Strings have many built-in functions that we can use to manipulate text. [https://docs.python.org/3/library/stdtypes.html#string-methods Here's a list].
:#Lets try out several different functions:<source lang="python">
print(course_name.lower()) # Returns a string in lower-case letters
print(course_name.upper()) # Returns a string in upper-case letters
print(course_name.swapcase()) # Returns a string with upper-case and lower-case letters swapped
print(course_name.title()) # Returns a string with upper-case first letter of each word, lowercase for remaining text
print(course_name.capitalize()) # Returns a string with upper-case first letter only, lowercase for remaining text
</source>
:#These values can be saved inside new strings and then reused:<source lang="python">
lower_name = course_name.lower() # Save returned string lower-case string inside new string variable
print(lower_name)
</source>
:#If a string contains many values separated by a single character, such as a space, the string can be split on those values and create a list of values<source>
lower_name.split(' ') # Provide the split() function with a character to split on
</source>The above example will return a list of strings, which we can access just like all of lists. <br><br>
:#Let's practice more string manipulation:<source lang="python">
list_of_strings = lower_name.split(' ') # Split string on spaces and store the list in a variable
print(list_of_strings) # Display list
print(list_of_strings[0]) # Display first item in list
</source>Since lists are actually a list of '''strings''', you should be able to use any function that works with a string on a list:<source lang="python">
list_of_strings[0].upper() # Use the function after the index to affect a single string within a list
first_word = list_of_strings[0]
print(first_word)
</source>The '''index''' that is used to access <u>items</u> within a list, can also be used to access <u>characters</u> within a string. For practice, let's create a new string, and start accessing the strings index:<source>
course_name = 'Open System Automation'
course_code = 'OPS435'
course_number = 435
print(course_code[0]) # Print the first character in course_code
print(course_code[2]) # Print the third character in course_code
print(course_code[-1]) # Print the last character in course_code
print(str(course_number)[0]) # Turn the integer into a string, return first character in that string, and print it
print(course_code[0] + course_code[1] + course_code[2])
</source>
:#You can use a technique that uses index numbers of a string to '''cut-out''' or '''"parse"''' smaller portions of text within a string. This term is referred to as a '''substring'''. We can use this to create a new string or display only a small portion of it:<source lang="python">
print(course_name[0:4]) # Print the first four characters (values of index numbers 0,1,2, and 3)
first_word = course_name[0:4] # Save this substring for later use
print(course_code[0:3]) # Print the first three characters (values of index numbers 0,1,and 2)
</source>
:# The index allows a few '''extra functions''' using the same parsing technique:<source lang="python">
course_name = 'Open System Automation'
print(course_name[12:]) # Print the substring '12' index until end of string
print(course_name[5:]) # Print the substring '5' index until end of string
print(course_name[-1]) # Print the last character
</source>With '''negative indices''', '''-1''' would represent the '''last''' character, '''-2''' index would represent the '''second last''' character, etc.:<source lang="python">
course_name = 'Open System Automation'
print(course_name[-1])
print(course_name[-2])
</source>
:# Practice some of the skills that you have learned in this section:<source>
course_name = 'Open System Automation'
print(course_name[-10:]) # Return the last ten characters
print(course_name[-10:-6]) # Try and figure out what this is returning
print(course_name[0:4] + course_name[-10:-6]) # Combine substrings together
substring = course_name[0:4] + course_name[-10:-6] # Save the combined substring as a new string for later
print(substring)
</source>
:# The real power found in substrings goes beyond just manually writing index values and getting back words. The next part of this investigation will cover how to search through a string for a specific word, letter, number, and return the index to that search result.
if __name__ == PART 1 - String Basics =='__main__': print(first_five(str1)) print(first_five(str2)) print(last_seven(str1)) print(last_seven(str2)) print(middle_number(num1)) print(middle_number(num2)) print(first_three_last_three(str1, str2)) print(first_three_last_three(str2, str1))</source>
= LAB 1 4 SIGN-OFF (SHOW INSTRUCTOR) =
[[Image:lab1_signoff.png|thumb|right|450px|Students should be prepared with '''all required commands (system information) displayed in a terminal (or multiple terminals) prior to calling the instructor for signoff'''.]]
:'''Have Ready to Show Your Instructor:'''
::<span style="color:green;font-size:1.5em;">✓</span> xOutput of: <code>./CheckLab4.py -f -v</code>::<span style="color:green;font-size:1.5em;">✓</span> x:Output of:<span style="color:green;font-size:1code>cat lab4a.py lab4b.py lab4c.py lab4d.5em;">✓py</spancode> Lab1 logbook notes completed
= LAB REVIEW =
# What is the purpose of a '''tuple'''? How does a tuple differ from a list?# How do you define elements within a tuple?# Write Python code to confirm if the string ''''OPS435'''' exists within the tuple called '''courses'''.# What is the purpose of a '''set'''? How do sets differ from lists or tuples?# How do you define elements within a set?# Assuming you have defined two sets called '''set1''' and '''set2'''. Write Python code to:<ol type= Practice For Quizzes"a"><li>Return a set containing all values of both sets</li><li>Returns a set containing all values in set1 that are not found in set2</li><li>Return a set containing all values that both sets DO NOT share</li></ol># What is the purpose of a dictionary?# How do you define elements within a dictionary?# Write Python commands to display for a dictionary called '''my_dictionary''' the dictionary key called '''my_key''' and a dictionary value for that key?# What is the purpose for the '''range()''', Tests'''len()''', Midterm & Final Exam '''append()''', and '''map()''' functions for a dictionary?# List and briefly explain the following functions (methods) that can be used with strings:<br>'''lower()''' , '''upper()''' , '''swapcase()''' , '''title()''' , '''captilize()''' , '''split()'''# Assume you issued the following command in your ipython3 shell:<br>'''course_name = 'Programming with Python''''<br>What will be the output for each of the following Python commands?<ol type="a"><li>'''course_name[3:11]'''</li><li>'''course_name[10:]'''</li><li>'''course_name[-1]</li></ol>