Session 17
Session 17
Problem
A hospital has received a set of lab reports. Totally five tests
are conducted in the lab and the report is prepared in such a
way that the ‘nth’ number correspond to value of testn . Given
the details of a test made for a patient, write an algorithm
and the subsequent Python program to print if the test result
is normal or not normal by referring the values in Table 1.
Since the value is sensitive, provide a mechanism so that
the values do not get altered.
Name of the Minimum Maximum
Test Value Value
Test1 20 30
Test2 35.5 40
Test3 12 15
Test4 120 150
Test5 80 120
PAC For Lab Test Problem
Input Processing Output
FOR i =0 to 5
READ test_Namei
READ minimumi
READ maximumi
Map test_Namei to minimumi and maximumi
READ test_Name_Chk
READ observed_Value
END_FOR
IF observed_Value>min of test_Name_Chk
and observed_Value <max of test_Name_Chk
THEN
PRINT ‘Normal’
ELSE
PRINT ‘Abnormal’
END IF
>>> T
>>> sorted(T)
>>> T = (1, 2, 3, 4, 5)
>>> L = [x + 20 for x in T]
Equivalent to:
>>>L = []
>>>for x in T:
L.append(x+20)
>>> L
[21, 22, 23, 24, 25]
Index method can be used to find the position of
particular value in the tuple.
>>> T = (1, 2, 3, 2, 4, 2)
>>> T.index(2) # Offset of first appearance of 2
1
>>> T.index(2, 2) # Offset of appearance after offset 2
3
>>> T.count(2) # How many 2s are there?
3
Nested Tuples
>>> T = (1, [2, 3], 4)
>>> T[1] = 'spam' # fails: can't change
tuple itself TypeError: object doesn't support item
assignment
>>> T[1][0] = 'spam'
# Works: can change mutables inside
>>> T
(1, ['spam', 3], 4)
>>> bob = ('Bob', 40.5, ['dev', 'mgr'])
# Tuple record
>>> bob
('Bob', 40.5, ['dev', 'mgr'])
>>> bob[0], bob[2] # Access by position
('Bob', ['dev', 'mgr'])
# Prepares a Dictionary record from tuple
>>> bob
{'jobs': ['dev', 'mgr'], 'name': 'Bob', 'age': 40.5}
tuple(seq)
t2=tuple([2,4])
>>> t2
(2, 4)
Problem:
An University has published the results of the term
end examination conducted in April. List of failures in
physics, mathematics, chemistry and computer
science is available. Write a program to find the
number of failures in the examination. This includes
the count of failures in one or more subjects
PAC For University Result Problem
Input Processing Output
Set is mutable
No duplicates
Sets are iterable, can grow and shrink on demand,
and may contain a variety of object types
Does not support indexing
x = {1, 2, 3, 4}
y = {'apple','ball','cat'}
x1 = set('spam') # Prepare set from a string
print (x1)
{'s', 'a', 'p', 'm'}
x1.add('alot') # Add an element to the set
print (x1)
{'s', 'a', 'p', 'alot', 'm'}
Set Operations
Let S1 = {1, 2, 3, 4}
Union (|)
S2 = {1, 5, 3, 6} | S1
print(S2) # prints {1, 2, 3, 4, 5, 6}
Intersection (&)
S2 = S1 & {1, 3}
print(S2) # prints {1, 3}
Difference (-)
S2 = S1 - {1, 3, 4}
print(S2) # prints {2}
Super set (>)
S2 = S1 > {1, 3}
print(S2) # prints True
Empty sets must be created with the set built-in, and
print the same way
S2 = S1 - {1, 2, 3, 4}
print(S2) # prints set() – Empty set
Empty curly braces represent empty dictionary but
not set
In interactive mode – type({}) gives
<class 'dict'>
>>> {1, 2, 3} | {3, 4}
{1, 2, 3, 4}
>>> {1, 2, 3} | [3, 4]
TypeError: unsupported operand type(s) for |: 'set'
and 'list'
>>> {1, 2, 3} | set([3, 4]) #Convert list to set and work
{1,2,3,4}
>>> {1, 2, 3}.union([3, 4])
{1,2,3,4}
>>> {1, 2, 3}.union({3, 4})
{1,2,3,4}
Immutable constraints and frozen sets
Can only contain immutable (a.k.a. “hashable”)
object types
lists and dictionaries cannot be embedded in sets,
but tuples can if you need to store compound values.
Tuples compare by their full values when used in set
operations:
>>> S
{1.23}
>>> S.add([1, 2, 3])
TypeError: unhashable type: 'list'
>>> S.add({'a':1})
TypeError: unhashable type: 'dict'
Works for tuples:
>>> S.add((1, 2, 3))
>>> S
{1.23, (1, 2, 3)}
>>> S | {(4, 5, 6), (1, 2, 3)}
{1.23, (4, 5, 6), (1, 2, 3)}
>>> (1, 2, 3) in S # Check for tuple as a whole
True
>>> (1, 4, 3) in S
False
clear()
All elements will removed from a set.
>>> cities = {"Stuttgart", "Konstanz", "Freiburg"}
>>> cities.clear()
>>> cities
set() # empty
>>>
Copy
Creates a shallow copy, which is returned.
>>> more_cities = {"Winterthur","Schaffhausen","St.
Gallen"}
>>> cities_backup = more_cities.copy()
>>> more_cities.clear()
>>> cities_backup # copied value is still available
{'St. Gallen', 'Winterthur', 'Schaffhausen‘}
Just in case, you might think, an assignment might
be enough:
>>> more_cities = {"Winterthur","Schaffhausen","St.
Gallen"}
>>> cities_backup = more_cities #creates alias name
>>> more_cities.clear()
>>> cities_backup
set()
>>>
The assignment "cities_backup = more_cities" just
creates a pointer, i.e. another name, to the same
data structure.
difference_update()
removes all elements of another set from this set.
x.difference_update() is the same as "x = x - y"
>>> x = {"a","b","c","d","e"}
>>> y = {"b","c"}
>>> x.difference_update(y)
>>> x
{'a', 'e', 'd'}
discard(el)
el will be removed from the set, if it is contained in
the set and nothing will be done otherwise
>>> x = {"a","b","c","d","e"}
>>> x.discard("a")
>>> x
{'c', 'b', 'e', 'd'}
>>> x.discard("z")
>>> x
{'c', 'b', 'e', 'd'}
remove(el)
works like discard(), but if el is not a member of the
set, a KeyError will be raised.
>>> x = {"a","b","c","d","e"}
>>> x.remove("a")
>>> x
{'c', 'b', 'e', 'd'}
>>> x.remove("z")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'z’
isdisjoint()
This method returns True if two sets have a null
intersection
issubset()
x.issubset(y) returns True, if x is a subset of y
"<=" is an abbreviation for "Subset of" and ">=" for
"superset of"
"<" is used to check if a set is a proper subset of a
set
issuperset()
x.issuperset(y) returns True, if x is a superset
of y. ">=" - abbreviation for "issuperset of“
">" - to check if a set is a proper superset of a
set
>>> x = {"a","b","c","d","e"}
>>> y = {"c","d"}
>>> x.issuperset(y)
True
>>> x > y
True
>>> x >= y
True
>>> x >= x
True
>>> x > x
False
>>> x.issuperset(x)
True
>>> x = {"a","b","c","d","e"}
>>> y = {"c","d"}
>>> x.issubset(y)
False
>>> y.issubset(x)
True
>>> x < y
False
>>> y < x # y is a proper subset of x
True
>>> x < x # a set is not a proper subset of oneself.
False
>>> x <= x
True
pop()
pop() removes and returns an arbitrary set element.
The method raises a KeyError if the set is empty
>>> x = {"a","b","c","d","e"}
>>> x.pop()
'a'
>>> x.pop()
'c'
Sets themselves are mutable too, and so cannot be
nested in other sets directly;