Skip to content

Instantly share code, notes, and snippets.

@kantale
Last active May 31, 2021 08:47
Show Gist options
  • Save kantale/30527f8a43d630a2fb066a77ae48ca6a to your computer and use it in GitHub Desktop.
Save kantale/30527f8a43d630a2fb066a77ae48ca6a to your computer and use it in GitHub Desktop.
Θέματα τελικής εξέτασης ΒΙΟΛ-494, Πανεπιστήμιο Κρήτης . 24 Μαΐου 2021

Λίστα με θέματα για τη τελική εξέταση του μαθήματος ΒΙΟΛ-494, "Εισαγωγή στον προγραμματισμό", Τμήμα Βιολογίας, Πανεπιστήμιο Κρήτης. 24 Μαΐου 2021.

Διδάσκοντας: Αλέξανδρος Καντεράκης

Άσκηση 1

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο έναν αριθμό. Η συνάρτηση θα υπολογίζει την απόσταση του αριθμού της παραμέτρου από το 0 και το 10. Η συνάρτηση θα επιστρέφει:

  • 0 Αν ο αριθμός της παραμέτρου είναι πιο κοντά στο 0 από ότι στο 10.
  • 10 Αν ο αριθμός της παραμέτρου είναι πιο κοντά στο 10 από ότι στο 0 ή η απόσταση είναι ίδια.

Σημείωση 1: η απόσταση μεταξύ δύο αριθμών a και b είναι abs(a-b).

Παραδείγματα:

f(3) # Επιστρέφει 0
f(6) # Επιστρέφει 10
f(-100) # Επιστρέφει 0
f(+100) # Επιστρέφει 10
f(5) # Επιστρέφει 10

Άσκηση 2

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο τρεις αριθμούς. Η συνάρτηση θα επιτρέφει τον μικρότερη από τους τρεις αριθμούς.

Απαγορεύεται να χρησιμοποιήσετε min, ή sort. Θα πρέπει να χρησιμοποιήσετε μόνο if, return και τους τελεστές σύγκρισης

Άσκηση 3

Φτιάξτε μία συνάρτηση η οποία θα παίρνει τρεις παραμέτρους οι οποίοι θα είναι αριθμοί. Η συνάρτηση θα επιστρέφει τους δύο αριθμούς που έχουν τη μεγαλύτερη απόσταση μεταξύ τους.

Σημείωση 1: η απόσταση μεταξύ δύο αριθμών a και b είναι abs(a-b).

Άσκηση 4

Μια εταιρία πουλάει μπάλες με την εξής πολιτική:

  • Οι πρώτες 10 μπάλες κάθε παραγγελίας κοστίζουν 3 ευρώ η μία.
  • Οι Επόμενες 30 μπάλες (δηλαδή από την 11η μέχρι και τη 40η) κοστίζουν 2 ευρώ η μία
  • Οι Επόμενες 30 μπάλες (δηλαδή από τη 41η μέχρι και τη 70η) κοστίζουν 1 ευρώ η μία
  • Όλες οι επόμενες (δηλαδή από τη 71η μέχρι.. όσο πάει) κοστίζουν 0.5 ευρώ η μία.

Φτιάξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο, έναν ακέραιο αριθμό. Η συνάρτηση θα επιστρέφει το κόστος μίας παραγγελίας από τόσες μπάλες όσες ο αριθμός της παραμέτρου.

Για παράδειγμα:

f(5) # Επιστρέφει 15 (3*15)
f(15) # Επιστρέφει 40 (10*3 + 5*2)
f(60) # Επιστρέφει 110 (10*3 + 30*2 + 20*1)
f(100) # Επιστρέφει 135 (10*3 + 30*2 + 30*1 + 30*0.5)

Άσκηση 5

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο 2 αριθμούς, έστω α και β. Η συνάρτηση θα επιστρέφει 2 αριθμούς, έστω κ και λ τέτοιους ώστε:

  • κ+λ = α
  • κ*λ = β

Θα πρέπει δηλαδή:

k,l = f(5, 6)

print (k+l == 5) # Τυπώνεi True
print (k*l == 6) # Τυπώνεi True

Hint: Από τα μαθηματικά ισχύει: Αν κ και λ είναι οι 2 λύσεις της εξίσωσης: χ2-αχ+β=0. Τότε ισχύει: κ+λ=α και κ*λ=β.

Άσκηση 6

Φτιάξτε μία συνάρτηση η οποία θα παίρνει 4 παράμετρους οι οποίοι θα είναι αριθμοί, έστω α,β,γ,δ. Η συνάρτηση θα επιστρέφει:

  • True αν όλο το διάστημα α-β, ανήκει μέσα στο διάστημα γ-δ
  • False αν δεν ισχύει η παραπάνω συνθήκη.

Για παράδειγμα:

f(3,5,1,6) # Επιστρέφει True (το διάστημα 3-5 είναι μέσα στο 1-6)
f(0,3,1,6) # Επιστρέφει False (το διάστημα 0-3 δεν είναι όλο μέσα στο 1-6)
f(5,8,1,6) # Επιστρέφει False (το διάστημα 5-8 δεν είναι όλο μέσα στο 1-6)
f(0,7,1,6) # Επιστρέφει False (το διάστημα 0-7 δεν είναι όλο μέσα στο 1-6)

Άσκηση 7

Φτιάξτε μία συνάρτηση η οποία θα παίρνει 4 παραμέτρους, έστω α,β,γ,δ. Η συνάρτηση θα επιστρέφει:

  • True Αν δεν υπάρχει κανένα στοιχείο του διαστήματος α-β μέσα στο διάστημα γ-δ
  • False Αν δεν ισχύει η παραπάνω συνθήκη.

ΠΡΟΣΟΧΗ! Τα α,β,γ,δ μπορεί να είναι και δεκαδικοί. Μην λύσετε αυτή την άσκηση με sets!

Για παράδειγμα:

f(3,5,7,9) # Επιστρέφει True (δεν υπάρχει αριθμός που να ανήκει στο διάστημα 3-5 τέτοιος ώστε να ανήκει και στο 7-9) 
f(3,8,7,9) # Επιστρέφει False (Υπάρχει αριθμός που να ανήκει στο διάστημα 3-8 τέτοιος ώστε να ανήκει και στο 7-9)
f(7,8,7,9) # Επιστρέφει False (Υπάρχει αριθμός που να ανήκει στο διάστημα 7-8 τέτοιος ώστε να ανήκει και στο 7-9)
f(8,10,7,9) #  Επιστρέφει False (Υπάρχει αριθμός που να ανήκει στο διάστημα 8-10 τέτοιος ώστε να ανήκει και στο 7-9)
f(10,12,7,9) #  Επιστρέφει True (δεν υπάρχει αριθμός που να ανήκει στο διάστημα 10-12 τέτοιος ώστε να ανήκει και στο 7-9)

Άσκηση 8

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν όρισμα έναν ακέραιο αριθμό μεγαλύτερο από το 9. Η συνάρτηση θα επιστρέφει:

  • True αν το προτελευταίο ψηφίο του αριθμού (δεκάδες) είναι άρτιος (ζυγός)
  • False αν δεν ισχύει η παραπάνω συνθήκη

Για παράδειγμα:

f(123) # Επιστρέφει True
f(113) # Επιστρέφει False

Άσκηση 9

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν όρισμα ένα string.

  • Αν το string έχει περιττό (μονό) αριθμό από γράμματα, τότε θα αντικαταστεί τον έναν χαρακτήρα που βρίσκεται στη μέση του string με το αστεράκι (*)
  • Αν το string έχει άρτιο (ζυγό) αριθμό από γράμματα, τότε θα αντικαταστεί τους δύο χαρακτήρες που είναι στη μέση του string με αστεράκια (*).

Για παράδειγμα:

f('Μήτσος') # Επιστρέφει 'Μή**ος'
f('Ελένη') # Επιστρέφει 'Ελ*νη'

Άσκηση 10

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο ένα string. Το string θα αποτελείται από δύο λέξεις με ένα κενό μεταξύ τους. Για παράδειγμα: Δημήτρης Μητροπάνος. Δεν χρειάζεται να γράψετε κώδικα ώστε να το ελέγχετε αυτό. Η συνάρτηση θα επιστρέφει ένα string το οποίο θα αποτελείται από 2 strings ενωμένα με new line (ή αλλιώς enter ή αλλιώς: \n). Το πρώτο string θα περιέχει τη μεγαλύτερη από τις δύο λέξεις και το δεύτερο τη μικρότερη. Το δεύτερο string θα πρέπει να είναι στοιχισμένο (justified ή αλλιώς centered) πάνω στο πρώτο. Δηλαδή θα πρέπει να προσθέσετε κενά στην αρχή του 2ου string ώστε το κέντρο του 2ου string να είναι το ίδιο με το κέντρο του 1ου string. Αν το 1ο string έχει άρτιο μήκος τότε πρέπει να στοιχίσετε το 2ο string στο πρώτο από τα δύο μεσαία γράμματα: Παραδείγματα:

print (f('a bbb')) # Τυπώνει:
bbb
 a


print (f('bbb a')) # Τυπώνει:
bbb
 a

print (f('bbbb a')) # Τυπώνει:
bbbb
 a

print (f('a bbbb')) # Τυπώνει:
bbbb
 a

print (f('Δημήτρης Μητροπάνος')) # Τυπώνει:
Μητροπάνος
 Δημήτρης

print (f('jennifer lopez')) # Τυπώνει:
jennifer
 lopez

Άσκηση 11

Φτιάξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο η οποία θα είναι ένα string του οποίου το μέγεθος θα είναι πολλαπλάσιο του 3 (δεν χρειάζεται να το ελέγξετε αυτό). Η συνάρτηση θα επιστρέφει το string όπου σε κάθε τρία γράμματα θα υπάρχει ανάμεσά τους ο χαρακτήρας |. Για παράδειγμα:

f('aaabbbccc') # Επιστρέφει f('aaa|bbb|ccc')

Άσκηση 12

Δίνεται το παρακάτω dictionary το οποίο περιέχει τη κωδικοποίηση των αριθμών στον κώδικα Mors:

mors = {
    0: '−−−−−',
    1: '.−−−−',
    2: '..−−−',
    3: '...−−',
    4: '....-',
    5: '.....',
    6: '-....',
    7: '--...',
    8: '---..',
    9: '----.',
}

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο ένα string το οποίο θα αναπαριστάει έναν αριθμό σε κώδικα Mors. H συνάρτηση θα επιστρέφει τον αριθμό ο οποίος αναπαριστάται. Για παράδειγμα:

f('.−−−−..−−−...−−') # Επιστρέφει: 123
f('−−−−−−−−−−---..') # Επιστρέφει: 8

Άσκηση 13

Δίνεται το παρακάτω dictionary το οποίο περιέχει τη κωδικοποίηση των αριθμών στον κώδικα Mors:

mors = {
    0: '−−−−−',
    1: '.−−−−',
    2: '..−−−',
    3: '...−−',
    4: '....-',
    5: '.....',
    6: '-....',
    7: '--...',
    8: '---..',
    9: '----.',
}

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο ένα αριθμό. Η συνάρτηση θα επιστρέφει τη κωδικοποίηση αυτού του αριθμού σε κώδικα Mors.

Για παράδειγμα:

f(123) # Επιστρέφει '.−−−−..−−−...−−' 

Άσκηση 14

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο 2 strings, έστω a,b. Η συνάρτηση θα επιστρέφει True/False ανάλογα με αν η δεύτερη παράμετρος υπάρχει στη 1η. Για να γίνει αυτό θα μπορούσε κάποιος απλά να χρησιμοποιήσει τον τελεστή in (b in a). Η συνάρτησή σας θα πρέπει όμως να επιτρέπει την ύπαρξη του b στο a, αν αφαιρέσουμε έναν χαρακτήρα από το b. Για παράδειγμα:

f('mitsos', 'its') # True
f('mitsos', 'itos') # True (αν αφαιρέσουμε τον χαρακτήρα o από το itos, τότε το itos υπάρχει στο mitsos)
f('mitsos', 'ita') # True
f('mitsos', 'itosa') # False
f('mitsos', 'itsaa') # False

Άσκηση 15

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο 2 strings, έστω a,b. Η συνάρτηση θα επιστρέφει True/False ανάλογα με αν η δεύτερη παράμετρος υπάρχει στη 1η. Για να γίνει αυτό θα μπορούσε κάποιος απλά να χρησιμοποιήσει τον τελεστή in (b in a). Η συνάρτησή σας θα πρέπει όμως να επιτρέπει την ύπαρξη του b στο a, αν προσθέσουμε έναν οποιοδήποτε χαρακτήρα στο b. Για παράδειγμα:

f('mitsos', 'its') # True
f('mitsos', 'itss') # True (αν προσθέοσυμε το ο στο itss θα γίνει itsos το οποίο υπάρχει στο mitsos )
f('mitsos', 'itsa') # False

Άσκηση 16

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο μία λίστα από strings. Η συνάρτηση θα επιστρέφει μία ταξινόμηση της λίστας με βάση το διαφορετικό πλήθος από διαφορετικά γράμματα που περιέχουν. Τα strings τα οποία έχουν τα λιγότερα διαφορετικά γράμματα πρέπει να είναι στην αρχή της λίστας. Για παράδειγμα:

a = [
    'abcd', # 4 διαφορετικά γράμματα
    'aaaabbbbcccc', # 3 διαφορετικά γράμματα 
    'aaa', # 1 διαφορετικά γράμματα
]

f(a)
# Επιστρέφει:
a = [
    'aaa',
    'aaaabbbbcccc', 
    'abcd',
]

Άσκηση 17

Φτιάξτε μία συνάρτηση η οποία δέχεται δύο παράμετρους ένα string (έστω α) και έναν ακέραιο αριθμό (έστω β). Η συνάρτηση θα επιστρέφει:

  • True αν το α μπορει να γραφτεί σαν επαναλήψεις ενός string μεγέθους β.
  • False αν δεν μπορεί να γίνει το παραπάνω.

Για παράδειγμα:

f('abcabcabcabc', 3) # Επιστρέφει True. Το 'abcabcabcabc' μπορεί να γραφτεί σαν επαναλήψεις του string ('abc') το οποίο έχει μέγεθος 3
f('abcabcabcabc', 4) # Επιστρέφει False. Δεν υπάρχει string με μέγεθος 4 με το οποίο αν φτιάξουμε επαναλήψεις θα έχουμε το string 'abcabcabcabc'
f('12211221', 4) # Επιστρέφει True. To 12211221 μπορεί να γραφτεί σαν επαναλήψεις του string ('1221') το οποίο έχει μέγεθος 4
f('aaaa', 1) # Επιστρέφει True ('a')
f('aaaa', 2) # Επιστρέφει True ('aa')
f('aaaa', 3) # Επιστρέφει False 

Άσκηση 18

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο έναν ακέραιο αριθμό n. H συνάρτηση θα επιστρέφει έναν από τους ακέραιους αριθμούς:

  • 1, αν ο n είναι άρτιος (ζυγός) και μικρότερος ή ίσος από το 50
  • 2, αν ο n είναι άρτιος (ζυγός) και μεγαλύτερος από το 50
  • 3, αν ο n είναι περιττός (μονός) και μικρότερος ή ίσος από το 50
  • 4, αν ο n είναι περιττός (μονός) και μεγαλύτερος από το 50

Άσκηση 19

Φτιάξτε μία συνάρτη η οποία θα παίρνει 2 αριθμούς (χ,ψ). Η συνάρτηση θα επιστρέφει:

  • 1, Αν και οι δύο είναι θετικοί
  • 2, Αν ο χ είναι αρνητικός και ο ψ θετικός
  • 3, Αν και οι δύο είναι αρνητικοί
  • 4, Αν ο χ είναι θετικός και ο ψ αρνητικός
  • 5, Αν ο χ είναι 0 και ο ψ δεν είναι 0
  • 6, Αν ο χ δεν είναι 0 και ο ψ είναι 0
  • 7, Αν ο χ και ο ψ είναι 0.

Άσκηση 20

Γράψτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο ένα string, έστω α. Η συνάρτηση θα επιστρέφει το μεγαλύτερο δυνατό υπο-string του a το οποίο αποτελείται μόνο από τους χαρακτήρες: A,C,G,T. Αν δεν υπάρχει τέτοιο υπο-string τότε επιστρέφει None. Για παράδειγμα:

f('AC-ACGT-ACG') # Επιστρέφει: 'ACGT'
f('11AAAAAA22CCCC') # Επιστρέφει: 'AAAAAA'
f('MITSOS') # Επιστρέφει 'Τ'
F('MTLSOS') # Επιστρέφει None

Σημείωση: υπο-string ενός string A είναι ένα string το οποίο υπάρχει στο Α. Για παράδειγμα το 'its' είναι υπο-string του 'Mitsos'.

Άσκηση 21

Γράψτε δύο συνάρτησεις με τα όνοματα f_1 και f_2. Και οι δύο συναρτήσεις θα παίρνουν σαν παράμετρο έναν αριθμό και θα επιστρέφουν έναν αριθμό. Οι συναρτήσεις θα πρέπει να είναι τέτοιες ώστε:

f_1(x) == x #Αυτό είναι False για όλα τα δυνατά x 

f_2(x) == x #Αυτό είναι False για όλα τα δυνατά x

f_1(f_2(x)) == x  #Αυτό είναι True για όλα τα δυνατά x

Άσκηση 22

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο μία λίστα από string, έστω α. H συνάρτηση θα επιστρέφει μία λίστα με όλα τα string τα οποία περιέχουν τουλάχιστον έναν (δηλαδή έναν ή παραπάνω) ζυγό (άρτιο) αριθμό.

Για παράδειγμα:

a = ['aaa', 'bb4b', '57hh', '901']

f(a)
# Επιστρέφει:
['bb4b', '901'] # το 4 είναι άρτιος και το 0 είναι άρτιος

Άσκηση 23

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο μία λίστα απο tuples. Κάθε tuple θα έχει δύο αριθμούς (έστω α,β). Η συνάρτηση θα επιστρέφει μία λίστα όπου κάθε στοιχείο θα έχει τη λύση της εξίσωσης αx+β=0 για το αντίστοιχο στοιχείο της λίστας της παραμέτρου. Αν ένα στοιχείο της παραμέτρου περιέχει μία αδύνατη εξίσωση ή μία εξίσωση-ταυτότητα τότε δεν συμπεριλαμβάνεται στη λίστα που επιστρέφεται. Για παράδειγμα:

l = [
(2,-4), # 2x-4 = 0,  λύση: χ=2
(0, 1), # 0χ+1 = 0,  αδύνατη
(1, 5), # 1χ+5 = 0,  λύση: χ=-5
(0, 0), # 0χ+0 = 0,  ταυτότητα
(3, 0), # 3χ+0 = 0,  λύση: χ=0
]

f(l)
# Επιστρέφει:
[2, -5, 0]

Άσκηση 24

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο μία λίστα από strings. Η συνάρτηση θα επιστρέφει το άθροισμα των στοιχείων της λίστας τα οποία μπορούν να μετατραπούν σε αριθμό. Για παράδειγμα:

l = [
    '2', 
    '2.5',
    'mitsos',
    '-1.5',
    '-1t',
]
f(l) # Επιστρέφει 3.0 : 2+2.5-1.5

Άσκηση 25

Φτιάξτε μία συνάρτηση η οποία παίρνει σαν παράμετρο μία λίστα με ακέραιους αριθμούς. Η συνάρτηση θα επιστρέφει τον μέσο όρο των άρτιων (ζυγών αριθμών). Για παράδειγμα:

a = [4, 2, 11, 18, 12, 12, 16, 15, 5, 10, 6, 16]
f(a) # Επιστρέφει: 10.666666666666666 

Άσκηση 26

Δίνεται το παρακάτω dictionary:

d = {'YNVY': [(1201, 1681), (2032, 2740)],
 'FRNE': [(1343, 1624), (2186, 2848), (3250, 3604), (4348, 4842)],
 'LHZO': [(1020, 1848), (2498, 2884), (3249, 3574)],
 'OWWN': [(1011, 1892), (2426, 2775), (3239, 3867), (4415, 4895)],
 'GRFW': [(1129, 1583), (2146, 2548)],
 'AKAU': [(1149, 1766),
  (2399, 2895),
  (3280, 3561),
  (4099, 4965),
  (5149, 5696)],
 'KVHH': [(1317, 1749),
  (2458, 2946),
  (3061, 3651),
  (4192, 4735),
  (5187, 5749),
  (6305, 6644)],
 'PKAB': [(1230, 1834), (2364, 2539), (3116, 3650)],
 'ZALE': [(1450, 1570), (2323, 2884), (3257, 3940), (4169, 4963)],
 'LKJY': [(1351, 1604),
  (2461, 2947),
  (3204, 3887),
  (4037, 4945),
  (5115, 5978),
  (6422, 6624),
  (7154, 7957),
  (8153, 8893)],
 'NZKA': [(1450, 1803),
  (2361, 2585),
  (3050, 3749),
  (4208, 4986),
  (5315, 5740),
  (6192, 6704),
  (7265, 7971),
  (8012, 8653),
  (9480, 9959)],
 'BBGG': [(1175, 1603), (2451, 2573)],
 'DCER': [(1107, 1786),
  (2174, 2553),
  (3372, 3608),
  (4323, 4527),
  (5081, 5580)],
 'YXLS': [(1043, 1751), (2143, 2868), (3115, 3611)],
 'ITAT': [(1121, 1885)],
 'EYYT': [(1267, 1725),
  (2119, 2745),
  (3085, 3902),
  (4135, 4929),
  (5265, 5709),
  (6360, 6897),
  (7477, 7502),
  (8334, 8949),
  (9434, 9517)],
 'OXTB': [(1035, 1859),
  (2247, 2643),
  (3367, 3827),
  (4111, 4513),
  (5216, 5554),
  (6443, 6952),
  (7406, 7650)],
 'GKHK': [(1004, 1615), (2478, 2892), (3298, 3903), (4379, 4810)],
 'EBRP': [(1077, 1948),
  (2497, 2833),
  (3317, 3579),
  (4371, 4863),
  (5354, 5694),
  (6391, 6718),
  (7100, 7809),
  (8308, 8939)],
 'HKDI': [(1205, 1966),
  (2164, 2982),
  (3393, 3749),
  (4222, 4816),
  (5109, 5593),
  (6072, 6649)]}

Το dictionary αυτό περιέχει τις θέσεις πάνω σε ένα χρωμόσωμα όπου αντιστοιχούν η αρχή και το τέλος των εξωνίων από 20 γονίδια (όλα τα δεδομένα είναι τυχαία). Όπως παρατηρούμε κάθε γονίδιο μπορεί να έχει διαφορετικό πλήθος από εξόνια.

Γράξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένα dictionary όπως το d. Η συνάρτηση θα επιστρέφει το όνομα του γονιδίου με το μεγαλύτερο συνολικό μήκος των εξονίων του. Για παράδειγμα το γονίδιο 'BBGG': [(1175, 1603), (2451, 2573)] έχει μήκος εξονίων: 1603-1175 + 2573-2451 = 550. Ποιο είναι το γονίδιο με το μεγαλύτερο συνολικό μήκος εξονίων;

Άσκηση 27

Δίνεται το παρακάτω dictionary:

d = {'YNVY': [(1201, 1681), (2032, 2740)],
 'FRNE': [(1343, 1624), (2186, 2848), (3250, 3604), (4348, 4842)],
 'LHZO': [(1020, 1848), (2498, 2884), (3249, 3574)],
 'OWWN': [(1011, 1892), (2426, 2775), (3239, 3867), (4415, 4895)],
 'GRFW': [(1129, 1583), (2146, 2548)],
 'AKAU': [(1149, 1766),
  (2399, 2895),
  (3280, 3561),
  (4099, 4965),
  (5149, 5696)],
 'KVHH': [(1317, 1749),
  (2458, 2946),
  (3061, 3651),
  (4192, 4735),
  (5187, 5749),
  (6305, 6644)],
 'PKAB': [(1230, 1834), (2364, 2539), (3116, 3650)],
 'ZALE': [(1450, 1570), (2323, 2884), (3257, 3940), (4169, 4963)],
 'LKJY': [(1351, 1604),
  (2461, 2947),
  (3204, 3887),
  (4037, 4945),
  (5115, 5978),
  (6422, 6624),
  (7154, 7957),
  (8153, 8893)],
 'NZKA': [(1450, 1803),
  (2361, 2585),
  (3050, 3749),
  (4208, 4986),
  (5315, 5740),
  (6192, 6704),
  (7265, 7971),
  (8012, 8653),
  (9480, 9959)],
 'BBGG': [(1175, 1603), (2451, 2573)],
 'DCER': [(1107, 1786),
  (2174, 2553),
  (3372, 3608),
  (4323, 4527),
  (5081, 5580)],
 'YXLS': [(1043, 1751), (2143, 2868), (3115, 3611)],
 'ITAT': [(1121, 1885)],
 'EYYT': [(1267, 1725),
  (2119, 2745),
  (3085, 3902),
  (4135, 4929),
  (5265, 5709),
  (6360, 6897),
  (7477, 7502),
  (8334, 8949),
  (9434, 9517)],
 'OXTB': [(1035, 1859),
  (2247, 2643),
  (3367, 3827),
  (4111, 4513),
  (5216, 5554),
  (6443, 6952),
  (7406, 7650)],
 'GKHK': [(1004, 1615), (2478, 2892), (3298, 3903), (4379, 4810)],
 'EBRP': [(1077, 1948),
  (2497, 2833),
  (3317, 3579),
  (4371, 4863),
  (5354, 5694),
  (6391, 6718),
  (7100, 7809),
  (8308, 8939)],
 'HKDI': [(1205, 1966),
  (2164, 2982),
  (3393, 3749),
  (4222, 4816),
  (5109, 5593),
  (6072, 6649)]}

Το dictionary αυτό περιέχει τις θέσεις πάνω σε ένα χρωμόσωμα όπου αντιστοιχούν η αρχή και το τέλος των εξωνίων από 20 γονίδια (όλα τα δεδομένα είναι τυχαία). Όπως παρατηρούμε κάθε γονίδιο μπορεί να έχει διαφορετικό πλήθος από εξόνια.

Γράψτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένα dictionary σαν το d η συνάρτηση θα επιστρέφει μία λίστα από strings. Η λίστα αυτή πρέπει να περιέχει τα ονόματα των γονιδίων ταξινομημένα ανάλογα με το συνολικό μήκος των εξονίων τους, ξεκινώντας από το μικρότερο και καταλήγοντας στο μεγαλύτερο. Για παράδειγμα το μήκος των εξονίων του γονίδιου BBGG σύμφωνα με αυτό: 'BBGG': [(1175, 1603), (2451, 2573)] είναι: 1603-1175 + 2573-2451 = 550.

Άσκηση 28

Δίνεται το παρακάτω dictionary:

d = {'YNVY': [(1201, 1681), (2032, 2740)],
 'FRNE': [(1343, 1624), (2186, 2848), (3250, 3604), (4348, 4842)],
 'LHZO': [(1020, 1848), (2498, 2884), (3249, 3574)],
 'OWWN': [(1011, 1892), (2426, 2775), (3239, 3867), (4415, 4895)],
 'GRFW': [(1129, 1583), (2146, 2548)],
 'AKAU': [(1149, 1766),
  (2399, 2895),
  (3280, 3561),
  (4099, 4965),
  (5149, 5696)],
 'KVHH': [(1317, 1749),
  (2458, 2946),
  (3061, 3651),
  (4192, 4735),
  (5187, 5749),
  (6305, 6644)],
 'PKAB': [(1230, 1834), (2364, 2539), (3116, 3650)],
 'ZALE': [(1450, 1570), (2323, 2884), (3257, 3940), (4169, 4963)],
 'LKJY': [(1351, 1604),
  (2461, 2947),
  (3204, 3887),
  (4037, 4945),
  (5115, 5978),
  (6422, 6624),
  (7154, 7957),
  (8153, 8893)],
 'NZKA': [(1450, 1803),
  (2361, 2585),
  (3050, 3749),
  (4208, 4986),
  (5315, 5740),
  (6192, 6704),
  (7265, 7971),
  (8012, 8653),
  (9480, 9959)],
 'BBGG': [(1175, 1603), (2451, 2573)],
 'DCER': [(1107, 1786),
  (2174, 2553),
  (3372, 3608),
  (4323, 4527),
  (5081, 5580)],
 'YXLS': [(1043, 1751), (2143, 2868), (3115, 3611)],
 'ITAT': [(1121, 1885)],
 'EYYT': [(1267, 1725),
  (2119, 2745),
  (3085, 3902),
  (4135, 4929),
  (5265, 5709),
  (6360, 6897),
  (7477, 7502),
  (8334, 8949),
  (9434, 9517)],
 'OXTB': [(1035, 1859),
  (2247, 2643),
  (3367, 3827),
  (4111, 4513),
  (5216, 5554),
  (6443, 6952),
  (7406, 7650)],
 'GKHK': [(1004, 1615), (2478, 2892), (3298, 3903), (4379, 4810)],
 'EBRP': [(1077, 1948),
  (2497, 2833),
  (3317, 3579),
  (4371, 4863),
  (5354, 5694),
  (6391, 6718),
  (7100, 7809),
  (8308, 8939)],
 'HKDI': [(1205, 1966),
  (2164, 2982),
  (3393, 3749),
  (4222, 4816),
  (5109, 5593),
  (6072, 6649)]}

Το dictionary αυτό περιέχει τις θέσεις πάνω σε ένα χρωμόσωμα όπου αντιστοιχούν η αρχή και το τέλος των εξωνίων από 20 γονίδια (όλα τα δεδομένα είναι τυχαία). Όπως παρατηρούμε κάθε γονίδιο μπορεί να έχει διαφορετικό πλήθος από εξόνια.

Γράψτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένα dictionary όπως το d η συνάρτηση θα επιστρέφει τον μέσο όρο των μέσων όρων των μηκών όλων των εξονίων για όλα τα γονίδια. Για παράδειγμα ας υποθέσουμε ότι

d2 = {
 'YNVY': [(1201, 1681), (2032, 2740)],
 'FRNE': [(1343, 1624), (2186, 2848), (3250, 3604), (4348, 4842)],
 'LHZO': [(1020, 1848), (2498, 2884), (3249, 3574)],
}

Ο μέσος όρος των μηκών των εξονίων του κάθε γονιδίου είναι:

YNVY = ((1681-1201) + (2740-2032))/2 = 594.0
FRNE = ((1624-1343) + (2848-2186) + (3604-3250) + (4842-4348))/4 = 447.75
LHZO = ((1848-1020) + (2884-2498) + (3574-3249))/3 = 513.0 

Άρα ο μέσος όρος των μέσων όρων των μηκών όλων των εξονίων για όλα τα γονίδια είναι:

(594.0 + 447.75 + 513.0)/3  = 518.25

Άσκηση 29

Δίνεται το παρακάτω dictionary:

d = {'YNVY': [(1201, 1681), (2032, 2740)],
 'FRNE': [(1343, 1624), (2186, 2848), (3250, 3604), (4348, 4842)],
 'LHZO': [(1020, 1848), (2498, 2884), (3249, 3574)],
 'OWWN': [(1011, 1892), (2426, 2775), (3239, 3867), (4415, 4895)],
 'GRFW': [(1129, 1583), (2146, 2548)],
 'AKAU': [(1149, 1766),
  (2399, 2895),
  (3280, 3561),
  (4099, 4965),
  (5149, 5696)],
 'KVHH': [(1317, 1749),
  (2458, 2946),
  (3061, 3651),
  (4192, 4735),
  (5187, 5749),
  (6305, 6644)],
 'PKAB': [(1230, 1834), (2364, 2539), (3116, 3650)],
 'ZALE': [(1450, 1570), (2323, 2884), (3257, 3940), (4169, 4963)],
 'LKJY': [(1351, 1604),
  (2461, 2947),
  (3204, 3887),
  (4037, 4945),
  (5115, 5978),
  (6422, 6624),
  (7154, 7957),
  (8153, 8893)],
 'NZKA': [(1450, 1803),
  (2361, 2585),
  (3050, 3749),
  (4208, 4986),
  (5315, 5740),
  (6192, 6704),
  (7265, 7971),
  (8012, 8653),
  (9480, 9959)],
 'BBGG': [(1175, 1603), (2451, 2573)],
 'DCER': [(1107, 1786),
  (2174, 2553),
  (3372, 3608),
  (4323, 4527),
  (5081, 5580)],
 'YXLS': [(1043, 1751), (2143, 2868), (3115, 3611)],
 'ITAT': [(1121, 1885)],
 'EYYT': [(1267, 1725),
  (2119, 2745),
  (3085, 3902),
  (4135, 4929),
  (5265, 5709),
  (6360, 6897),
  (7477, 7502),
  (8334, 8949),
  (9434, 9517)],
 'OXTB': [(1035, 1859),
  (2247, 2643),
  (3367, 3827),
  (4111, 4513),
  (5216, 5554),
  (6443, 6952),
  (7406, 7650)],
 'GKHK': [(1004, 1615), (2478, 2892), (3298, 3903), (4379, 4810)],
 'EBRP': [(1077, 1948),
  (2497, 2833),
  (3317, 3579),
  (4371, 4863),
  (5354, 5694),
  (6391, 6718),
  (7100, 7809),
  (8308, 8939)],
 'HKDI': [(1205, 1966),
  (2164, 2982),
  (3393, 3749),
  (4222, 4816),
  (5109, 5593),
  (6072, 6649)]}

Το dictionary αυτό περιέχει τις θέσεις πάνω σε ένα χρωμόσωμα όπου αντιστοιχούν η αρχή και το τέλος των εξωνίων από 20 γονίδια (όλα τα δεδομένα είναι τυχαία). Όπως παρατηρούμε κάθε γονίδιο μπορεί να έχει διαφορετικό πλήθος από εξόνια.

Φτιάξτε μία συνάρτηση η οποία θα παίρνει 2 παράμετρους. Η πρώτη θα είναι ένα dictionary όπως το d και η δεύτερη θα είναι ένα ακέραιος αριθμός a. Η συνάρτηση θα επιστρέφει μία λίστα με τα γονίδια τα οποία έχουν ένα εξόνιο στη θέση a. H συνάρτηση πρέπει να επιστρέφει μία λίστα με strings.

Για παράδειγμα το γονίδιο OXTB έχει εξόνιο στη θέση 1800 ενώ το GKHK δεν έχει εξώνιο σε αυτή τη θέση.

Άσκηση 30

Δίνεται το παρακάτω dictionary:

d = {'YNVY': [(1201, 1681), (2032, 2740)],
 'FRNE': [(1343, 1624), (2186, 2848), (3250, 3604), (4348, 4842)],
 'LHZO': [(1020, 1848), (2498, 2884), (3249, 3574)],
 'OWWN': [(1011, 1892), (2426, 2775), (3239, 3867), (4415, 4895)],
 'GRFW': [(1129, 1583), (2146, 2548)],
 'AKAU': [(1149, 1766),
  (2399, 2895),
  (3280, 3561),
  (4099, 4965),
  (5149, 5696)],
 'KVHH': [(1317, 1749),
  (2458, 2946),
  (3061, 3651),
  (4192, 4735),
  (5187, 5749),
  (6305, 6644)],
 'PKAB': [(1230, 1834), (2364, 2539), (3116, 3650)],
 'ZALE': [(1450, 1570), (2323, 2884), (3257, 3940), (4169, 4963)],
 'LKJY': [(1351, 1604),
  (2461, 2947),
  (3204, 3887),
  (4037, 4945),
  (5115, 5978),
  (6422, 6624),
  (7154, 7957),
  (8153, 8893)],
 'NZKA': [(1450, 1803),
  (2361, 2585),
  (3050, 3749),
  (4208, 4986),
  (5315, 5740),
  (6192, 6704),
  (7265, 7971),
  (8012, 8653),
  (9480, 9959)],
 'BBGG': [(1175, 1603), (2451, 2573)],
 'DCER': [(1107, 1786),
  (2174, 2553),
  (3372, 3608),
  (4323, 4527),
  (5081, 5580)],
 'YXLS': [(1043, 1751), (2143, 2868), (3115, 3611)],
 'ITAT': [(1121, 1885)],
 'EYYT': [(1267, 1725),
  (2119, 2745),
  (3085, 3902),
  (4135, 4929),
  (5265, 5709),
  (6360, 6897),
  (7477, 7502),
  (8334, 8949),
  (9434, 9517)],
 'OXTB': [(1035, 1859),
  (2247, 2643),
  (3367, 3827),
  (4111, 4513),
  (5216, 5554),
  (6443, 6952),
  (7406, 7650)],
 'GKHK': [(1004, 1615), (2478, 2892), (3298, 3903), (4379, 4810)],
 'EBRP': [(1077, 1948),
  (2497, 2833),
  (3317, 3579),
  (4371, 4863),
  (5354, 5694),
  (6391, 6718),
  (7100, 7809),
  (8308, 8939)],
 'HKDI': [(1205, 1966),
  (2164, 2982),
  (3393, 3749),
  (4222, 4816),
  (5109, 5593),
  (6072, 6649)]}

Το dictionary αυτό περιέχει τις θέσεις πάνω σε ένα χρωμόσωμα όπου αντιστοιχούν η αρχή και το τέλος των εξωνίων από 20 γονίδια (όλα τα δεδομένα είναι τυχαία). Όπως παρατηρούμε κάθε γονίδιο μπορεί να έχει διαφορετικό πλήθος από εξόνια.

Φτιάξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένα dictionary σαν το d. Η συνάρτηση θα επιστρέφει το όνομα του γονιδίου το οποίο έχει το μεγαλύτερο σε μήκος εξόνιο. Το μήκος ενός εξονίου είναι η διαφορά του τέλους με την αρχή του. Η συνάρτηση δηλάδή θα επιστρέφει ένα string.

Άσκηση 31

Φτιάξτε μία συνάρτηση η οποία δεν θα παίρνει καμία παράμετρο. Η συνάρτηση θα επιστρέφει μία λίστα. Κάθε στοιχείο της λίστας θα είναι μία λίστα ή ένα tuple από 4 ακέραιους αριθμούς α,β,γ,δ. Οι αριθμοί α,β,γ,δ θα είναι τέτοιοι ώστε να ισχύουν οι παρακάτω ιδιότητες:

  1. 1 <= α,β,γ,δ <= 15
  2. α != γ, α != δ, β != γ, β != δ (!= σημαίνει διαφορετικό)
  3. α<β, γ<δ, α<γ
  4. α3 + β3 = γ3 + δ3

Δίνεται ότι υπάρχει μόνο μία τετράδα α,β,γ,δ η οποία να ικανοποιεί όλες τις παραπάνω ιδιότητες.

Σημείωση: Να μία λίστα που περιέχει μία μοναδική τετράδα: a = [(1,2,3,4)].

Άσκηση 32

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν όρισμα μία λίστα από αριθμούς. Η συνάρτηση αρχικά θα αφαιρεί τα στοιχεία της λίστας τα οποία είναι ίσα με 0. Αν υποθέσουμε ότι n είναι το μέγεθος της λίστας (χωρίς τα 0) και x1, x2, ..., xn, είναι τα στοιχεία της λίστας (χωρίς το 0), η συνάρτηση πρέπει να επιστρέφει το αποτέλεσμα της έκφρασης:

img

Άσκηση 33

Ένας πληθυσμός με το όνομα Α αποτελείται από 20 ανθρώπους. Σε αυτούς τους ανθρώπους κάναμε γονοτύπηση σε 10 γενετικούς τόπους. Όλοι οι γονότυποι είναι δι-αλληλικοί (biallelic). Κάθε ένας από τους 10 γενετικούς τόπους έχει όνομα Μ1, Μ2, ... Μ10. Τα αποτελέσματα που πήραμε υπάρχουν σε αυτή τη λίστα:

pop_A = [
    ['M1', "AA", "AA", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "AA", "Aa", "Aa", "aa", "Aa", "AA", "Aa", "Aa", "Aa", "AA", "Aa",],
    ['M2', "AA", "AA", "Aa", "Aa", "AA", "Aa", "AA", "AA", "AA", "AA", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "Aa", "AA",],
    ['M3', "Aa", "Aa", "Aa", "AA", "AA", "aa", "AA", "AA", "Aa", "AA", "AA", "AA", "AA", "AA", "AA", "aa", "Aa", "AA", "aa", "Aa",],
    ['M4', "Aa", "Aa", "AA", "AA", "AA", "AA", "Aa", "aa", "Aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA",],
    ['M5', "AA", "AA", "aa", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "Aa", "Aa", "AA", "AA", "AA", "AA", "AA", "aa", "AA", "aa",],
    ['M6', "AA", "AA", "Aa", "AA", "aa", "AA", "AA", "AA", "Aa", "Aa", "aa", "aa", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA",],
    ['M7', "AA", "AA", "aa", "Aa", "Aa", "Aa", "AA", "aa", "Aa", "AA", "Aa", "AA", "Aa", "Aa", "AA", "AA", "Aa", "AA", "Aa", "AA",],
    ['M8', "AA", "Aa", "AA", "Aa", "Aa", "AA", "Aa", "AA", "AA", "AA", "AA", "AA", "Aa", "Aa", "Aa", "Aa", "aa", "AA", "AA", "aa",],
    ['M9', "AA", "AA", "Aa", "AA", "AA", "Aa", "aa", "Aa", "AA", "AA", "Aa", "Aa", "Aa", "Aa", "AA", "aa", "Aa", "AA", "aa", "Aa",],
    ['M10', "AA", "AA", "AA", "AA", "Aa", "AA", "AA", "Aa", "AA", "Aa", "Aa", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "Aa",]
]

Όπου Α είναι το πρωτεύον αλλήλιο του κάθε γονότυπου και a το δευτερεύον αλλήλιο.

Άρα:

  • ΑΑ: Ο γονότυπος είναι ομόζυγος στο πρωτεύον αλλήλιο.
  • Aa, aA, Ο γονότυπος είναι ετερόζυγος.
  • aa, Ο γονότυπος είναι ομόζυγος στο δευτερεύον αλλήλιο.

Φτιάξτε μία συνάρτηση ο οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι μία λίστα όπως η pop_A. Η συνάρτηση θα επιστρέφει το όνομα του γονότυπου με τη μεγαλύτερη αλληλική συχνότητα του δευτερεύοντος αλλήλιου. Για παράδειγμα θα πρέπει:

f(pop_A) # Επιστρέφει 'Μ9'

Άσκηση 34

Ένας πληθυσμός με το όνομα Α αποτελείται από 20 ανθρώπους. Σε αυτούς τους ανθρώπους κάναμε γονοτύπηση σε 10 γενετικούς τόπους. Όλοι οι γονότυποι είναι δι-αλληλικοί (biallelic). Κάθε ένας από τους 10 γενετικούς τόπους έχει όνομα Μ1, Μ2, ... Μ10. Τα αποτελέσματα που πήραμε υπάρχουν σε αυτή τη λίστα:

pop_A = [
    ['M1', "AA", "AA", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "AA", "Aa", "Aa", "aa", "Aa", "AA", "Aa", "Aa", "Aa", "AA", "Aa",],
    ['M2', "AA", "AA", "Aa", "Aa", "AA", "Aa", "AA", "AA", "AA", "AA", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "Aa", "AA",],
    ['M3', "Aa", "Aa", "Aa", "AA", "AA", "aa", "AA", "AA", "Aa", "AA", "AA", "AA", "AA", "AA", "AA", "aa", "Aa", "AA", "aa", "Aa",],
    ['M4', "Aa", "Aa", "AA", "AA", "AA", "AA", "Aa", "aa", "Aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA",],
    ['M5', "AA", "AA", "aa", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "Aa", "Aa", "AA", "AA", "AA", "AA", "AA", "aa", "AA", "aa",],
    ['M6', "AA", "AA", "Aa", "AA", "aa", "AA", "AA", "AA", "Aa", "Aa", "aa", "aa", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA",],
    ['M7', "AA", "AA", "aa", "Aa", "Aa", "Aa", "AA", "aa", "Aa", "AA", "Aa", "AA", "Aa", "Aa", "AA", "AA", "Aa", "AA", "Aa", "AA",],
    ['M8', "AA", "Aa", "AA", "Aa", "Aa", "AA", "Aa", "AA", "AA", "AA", "AA", "AA", "Aa", "Aa", "Aa", "Aa", "aa", "AA", "AA", "aa",],
    ['M9', "AA", "AA", "Aa", "AA", "AA", "Aa", "aa", "Aa", "AA", "AA", "Aa", "Aa", "Aa", "Aa", "AA", "aa", "Aa", "AA", "aa", "Aa",],
    ['M10', "AA", "AA", "AA", "AA", "Aa", "AA", "AA", "Aa", "AA", "Aa", "Aa", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "Aa",]
]

Όπου Α είναι το πρωτεύον αλλήλιο του κάθε γονότυπου και a το δευτερεύον αλλήλιο.

Άρα:

  • ΑΑ: Ο γονότυπος είναι ομόζυγος στο πρωτεύον αλλήλιο.
  • Aa, aA, Ο γονότυπος είναι ετερόζυγος.
  • aa, Ο γονότυπος είναι ομόζυγος στο δευτερεύον αλλήλιο.

Έστω τώρα η παρακάτω λίστα με 20 στοιχεία:

phenotype = ['N', 'D', 'D', 'D', 'N', 'D', 'D', 'N', 'N', 'D', 'N', 'N', 'D', 'N', 'D', 'N', 'D', 'N', 'D', 'D']

Η παρακάτω λίστα περιέχει τον φαινότυπο για τους 20 ανθρώπους. N σημαίνει ότι είναι "φυσιολογικός" (Normal) και D σημαίνει ότι έχει μία ασθένεια (Disease).

Για παράδειγμα ο 2ος άνθρωπος του πληθυσμού έχει την ασθένεια (D) και ο γονότυπός του στις 10 μεταλλάξεις είναι: AA, AA, Aa, Aa, AA, AA, AA, Aa, AA, AA.

Φτιάξτε μία συνάρτηση η οποία θα παίρνει 2 παράμετρους. Η πρώτη θα είναι μία λίστα όπως η pop_A και η δεύτερη θα είναι μία λίστα όπως η phenotype. Η συνάρτηση θα επιστρέφει μία λίστα με μέγεθος τόσο όσο και οι μεταλλάξεις που υπάρχουν στον pop_A (10 για το παράδειγμά μας). Κάθε στοιχείο της λίστας που θα επιστρέφει η συνάρτηση, θα έχει 4 αριθμούς:

  • Ο 1ος αριθμός θα είναι το πλήθος από τις εμφανίσεις του αλλήλιου A σε αυτούς που είναι φυσιολογικοί (N).
  • Ο 2ος αριθμός θα είναι το πλήθος από τις εμφανίσεις του αλλήλιου A σε αυτούς που έχουν την ασθένεια (D).
  • Ο 3ος αριθμός θα είναι το πλήθος από τις εμφανίσεις του αλλήλιου a σε αυτούς που είναι φυσιολογικοί (N).
  • Ο 4ος αριθμός θα είναι το πλήθος από τις εμφανίσεις του αλλήλιου a σε αυτούς που έχουν την ασθένεια (D).

Άσκηση 35

Ένας πληθυσμός με το όνομα Α αποτελείται από 20 ανθρώπους. Σε αυτούς τους ανθρώπους κάναμε γονοτύπηση σε 10 γενετικούς τόπους. Όλοι οι γονότυποι είναι δι-αλληλικοί (biallelic). Κάθε ένας από τους 10 γενετικούς τόπους έχει όνομα Μ1, Μ2, ... Μ10. Τα αποτελέσματα που πήραμε υπάρχουν σε αυτή τη λίστα:

pop_A = [
    ['M1', "AA", "AA", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "AA", "Aa", "Aa", "aa", "Aa", "AA", "Aa", "Aa", "Aa", "AA", "Aa",],
    ['M2', "AA", "AA", "Aa", "Aa", "AA", "Aa", "AA", "AA", "AA", "AA", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "Aa", "AA",],
    ['M3', "Aa", "Aa", "Aa", "AA", "AA", "aa", "AA", "AA", "Aa", "AA", "AA", "AA", "AA", "AA", "AA", "aa", "Aa", "AA", "aa", "Aa",],
    ['M4', "Aa", "Aa", "AA", "AA", "AA", "AA", "Aa", "aa", "Aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA",],
    ['M5', "AA", "AA", "aa", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "Aa", "Aa", "AA", "AA", "AA", "AA", "AA", "aa", "AA", "aa",],
    ['M6', "AA", "AA", "Aa", "AA", "aa", "AA", "AA", "AA", "Aa", "Aa", "aa", "aa", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA",],
    ['M7', "AA", "AA", "aa", "Aa", "Aa", "Aa", "AA", "aa", "Aa", "AA", "Aa", "AA", "Aa", "Aa", "AA", "AA", "Aa", "AA", "Aa", "AA",],
    ['M8', "AA", "Aa", "AA", "Aa", "Aa", "AA", "Aa", "AA", "AA", "AA", "AA", "AA", "Aa", "Aa", "Aa", "Aa", "aa", "AA", "AA", "aa",],
    ['M9', "AA", "AA", "Aa", "AA", "AA", "Aa", "aa", "Aa", "AA", "AA", "Aa", "Aa", "Aa", "Aa", "AA", "aa", "Aa", "AA", "aa", "Aa",],
    ['M10', "AA", "AA", "AA", "AA", "Aa", "AA", "AA", "Aa", "AA", "Aa", "Aa", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "Aa",]
]

Όπου Α είναι το πρωτεύον αλλήλιο του κάθε γονότυπου και a το δευτερεύον αλλήλιο.

Άρα:

  • ΑΑ: Ο γονότυπος είναι ομόζυγος στο πρωτεύον αλλήλιο.
  • Aa, aA, Ο γονότυπος είναι ετερόζυγος.
  • aa, Ο γονότυπος είναι ομόζυγος στο δευτερεύον αλλήλιο.

Έστω τώρα η παρακάτω λίστα με 20 στοιχεία:

phenotype = ['N', 'D', 'D', 'D', 'N', 'D', 'D', 'N', 'N', 'D', 'N', 'N', 'D', 'N', 'D', 'N', 'D', 'N', 'D', 'D']

Η παρακάτω λίστα περιέχει τον φαινότυπο για τους 20 ανθρώπους. N σημαίνει ότι είναι "φυσιολογικός" (Normal) και D σημαίνει ότι έχει μία ασθένεια (Disease).

Για παράδειγμα ο 2ος άνθρωπος του πληθυσμού έχει την ασθένεια (D) και ο γονότυπός του στις 10 μεταλλάξεις είναι: AA, AA, Aa, Aa, AA, AA, AA, Aa, AA, AA.

Φτιάξτε μία συνάρτηση η οποία θα παίρνει 2 παράμετρους. Η πρώτη θα είναι μία λίστα όπως η pop_A και η δεύτερη θα είναι μία λίστα όπως η phenotype. Η συνάρτηση θα επιστρέφει το όνομα της μετάλλαξης (ένα από τα M1, Μ2, ..., Μ10) στο οποίο η αλληλική συχνότητα του δευτερεύοντως αλληλίου (a) έχει τη μεγαλύτερη απόλυτη διαφορά μεταξύ των φυσιολογικών (N) και αυτών που έχουν την ασθένεια (D). Δηλαδή για κάθε μετάλλαξη μετράμε την αλληλική συχνότητα του a στους φυσιολογικούς (έστω ΑΣ_Ν) και την αλληλική συχνότητα του a στους μη-φυσιολογικους (έστω ΑΣ_D). Ποια είναι η μετάλλαξη με τη μεγαλύτερη τιμή της έκφρασης: abs(ΑΣ_Ν-ΑΣ_D) ;

Άσκηση 36

Ένας πληθυσμός με το όνομα Α αποτελείται από 20 ανθρώπους. Σε αυτούς τους ανθρώπους κάναμε γονοτύπηση σε 10 γενετικούς τόπους. Όλοι οι γονότυποι είναι δι-αλληλικοί (biallelic). Κάθε ένας από τους 10 γενετικούς τόπους έχει όνομα Μ1, Μ2, ... Μ10. Τα αποτελέσματα που πήραμε υπάρχουν σε αυτή τη λίστα:

pop_A = [
    ['M1', "AA", "AA", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "AA", "Aa", "Aa", "aa", "Aa", "AA", "Aa", "Aa", "Aa", "AA", "Aa",],
    ['M2', "AA", "AA", "Aa", "Aa", "AA", "Aa", "AA", "AA", "AA", "AA", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "Aa", "AA",],
    ['M3', "Aa", "Aa", "Aa", "AA", "AA", "aa", "AA", "AA", "Aa", "AA", "AA", "AA", "AA", "AA", "AA", "aa", "Aa", "AA", "aa", "Aa",],
    ['M4', "Aa", "Aa", "AA", "AA", "AA", "AA", "Aa", "aa", "Aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA",],
    ['M5', "AA", "AA", "aa", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "Aa", "Aa", "AA", "AA", "AA", "AA", "AA", "aa", "AA", "aa",],
    ['M6', "AA", "AA", "Aa", "AA", "aa", "AA", "AA", "AA", "Aa", "Aa", "aa", "aa", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA",],
    ['M7', "AA", "AA", "aa", "Aa", "Aa", "Aa", "AA", "aa", "Aa", "AA", "Aa", "AA", "Aa", "Aa", "AA", "AA", "Aa", "AA", "Aa", "AA",],
    ['M8', "AA", "Aa", "AA", "Aa", "Aa", "AA", "Aa", "AA", "AA", "AA", "AA", "AA", "Aa", "Aa", "Aa", "Aa", "aa", "AA", "AA", "aa",],
    ['M9', "AA", "AA", "Aa", "AA", "AA", "Aa", "aa", "Aa", "AA", "AA", "Aa", "Aa", "Aa", "Aa", "AA", "aa", "Aa", "AA", "aa", "Aa",],
    ['M10', "AA", "AA", "AA", "AA", "Aa", "AA", "AA", "Aa", "AA", "Aa", "Aa", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "Aa",]
]

Όπου Α είναι το πρωτεύον αλλήλιο του κάθε γονότυπου και a το δευτερεύον αλλήλιο.

Άρα:

  • ΑΑ: Ο γονότυπος είναι ομόζυγος στο πρωτεύον αλλήλιο.
  • Aa, aA, Ο γονότυπος είναι ετερόζυγος.
  • aa, Ο γονότυπος είναι ομόζυγος στο δευτερεύον αλλήλιο.

Έστω ότι δύο γονότυποι: ο Κ και ο Λ. Ορίζουμε τη διαφορά μεταξύ Κ και Λ ως την απόλυτη διαφορά του πλήθους του δευτερεύοντως αλληλίου μεταξύ του Κ και του Λ. Για παράδειγμα:

  • Η διαφορά του AA και του Αa είναι: 1 (το ΑΑ έχει 0 δευτερεύοντα αλληλία ενώ το Aa έχει 1. abs(0-1)=1).
  • Η διαφορά του AA και του aa είναι: 2 (το ΑΑ έχει 0 δευτερεύοντα αλληλία ενώ το aa έχει 2. abs(0-2)=2).
  • Η διαφορά του Aa και του aA είναι: 0 (το Αa έχει 1 δευτερεύοντα αλληλία ενώ το aA έχει 1. abs(1-1)=0).

Ορίζουμε επίσης την απόσταση μεταξύ 2 μεταλλάξεων ως τον μέσο όρο της διαφοράς των γονοτύπων για όλα τα άτομα του πληθυσμού. Για παράδειγμα αν ο γονότυπος της μετάλλαξης Μ1 για 3 άτομα είναι: AA, Aa, aa και ο γονότυπος της μετάλλαξης Μ2 για τα ίδια άτομα είναι AA, aa, AA. Τότε η απόσταση μεταξύ των μεταλλάξεων Μ1 και Μ2 είναι (0+1+2)/3=1.

Φτιάξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η συνάρτηση θα είναι μία λίστα με την ίδια δομή όπως η pop_A. Η συνάρτηση θα επιστρέφει ένα tuple το οποίο θα έχει 2 strings. Αυτά τα strings θα είναι τα ονόματα των δύο μεταλλάξεων που έχουν τη μικροτερη απόσταση.

Άσκηση 37

Ένας πληθυσμός με το όνομα Α αποτελείται από 20 ανθρώπους. Σε αυτούς τους ανθρώπους κάναμε γονοτύπηση σε 10 γενετικούς τόπους. Όλοι οι γονότυποι είναι δι-αλληλικοί (biallelic). Κάθε ένας από τους 10 γενετικούς τόπους έχει όνομα Μ1, Μ2, ... Μ10. Τα αποτελέσματα που πήραμε υπάρχουν σε αυτή τη λίστα:

pop_A = [
    ['M1', "AA", "AA", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "AA", "Aa", "Aa", "aa", "Aa", "AA", "Aa", "Aa", "Aa", "AA", "Aa",],
    ['M2', "AA", "AA", "Aa", "Aa", "AA", "Aa", "AA", "AA", "AA", "AA", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "Aa", "AA",],
    ['M3', "Aa", "Aa", "Aa", "AA", "AA", "aa", "AA", "AA", "Aa", "AA", "AA", "AA", "AA", "AA", "AA", "aa", "Aa", "AA", "aa", "Aa",],
    ['M4', "Aa", "Aa", "AA", "AA", "AA", "AA", "Aa", "aa", "Aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA",],
    ['M5', "AA", "AA", "aa", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "Aa", "Aa", "AA", "AA", "AA", "AA", "AA", "aa", "AA", "aa",],
    ['M6', "AA", "AA", "Aa", "AA", "aa", "AA", "AA", "AA", "Aa", "Aa", "aa", "aa", "aa", "AA", "AA", "AA", "Aa", "AA", "AA", "AA",],
    ['M7', "AA", "AA", "aa", "Aa", "Aa", "Aa", "AA", "aa", "Aa", "AA", "Aa", "AA", "Aa", "Aa", "AA", "AA", "Aa", "AA", "Aa", "AA",],
    ['M8', "AA", "Aa", "AA", "Aa", "Aa", "AA", "Aa", "AA", "AA", "AA", "AA", "AA", "Aa", "Aa", "Aa", "Aa", "aa", "AA", "AA", "aa",],
    ['M9', "AA", "AA", "Aa", "AA", "AA", "Aa", "aa", "Aa", "AA", "AA", "Aa", "Aa", "Aa", "Aa", "AA", "aa", "Aa", "AA", "aa", "Aa",],
    ['M10', "AA", "AA", "AA", "AA", "Aa", "AA", "AA", "Aa", "AA", "Aa", "Aa", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "Aa",]
]

Όπου Α είναι το πρωτεύον αλλήλιο του κάθε γονότυπου και a το δευτερεύον αλλήλιο.

Άρα:

  • ΑΑ: Ο γονότυπος είναι ομόζυγος στο πρωτεύον αλλήλιο.
  • Aa, aA, Ο γονότυπος είναι ετερόζυγος.
  • aa, Ο γονότυπος είναι ομόζυγος στο δευτερεύον αλλήλιο.

Έστω ότι δύο γονότυποι: ο Κ και ο Λ. Ορίζουμε τη διαφορά μεταξύ Κ και Λ ως την απόλυτη διαφορά του πλήθους του δευτερεύοντως αλληλίου μεταξύ του Κ και του Λ. Για παράδειγμα:

  • Η διαφορά του AA και του Αa είναι: 1 (το ΑΑ έχει 0 δευτερεύοντα αλληλία ενώ το Aa έχει 1. abs(0-1)=1).
  • Η διαφορά του AA και του aa είναι: 2 (το ΑΑ έχει 0 δευτερεύοντα αλληλία ενώ το aa έχει 2. abs(0-2)=2).
  • Η διαφορά του Aa και του aA είναι: 0 (το Αa έχει 1 δευτερεύοντα αλληλία ενώ το aA έχει 1. abs(1-1)=0).

Ορίζουμε επίσης την απόσταση μεταξύ 2 ατόμων του πληθυσμού ως τον μέσο όρο της διαφοράς των γονοτύπων για όλες τις μεταλλάξεις. Για παράδειγμα αν ο γονότυπος του ατόμου Χ για 3 μεταλλάξεις είναι: AA, Aa, aa και ο γονότυπος του ατόμου Υ για τις ίδιες 3 μεταλλάξεις είναι AA, aa, AA, τότε η απόσταση μεταξύ των ατόμων Χ και Y είναι (0+1+2)/3=1.

Φτιάξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η συνάρτηση θα είναι μία λίστα με την ίδια δομή όπως η pop_A. Η συνάρτηση θα επιστρέφει ένα tuple το οποίο θα έχει 2 strings. Αυτά τα strings θα είναι τα ονόματα των δύο ατόμων του πληθυσμού που έχουν τη μικροτερη απόσταση μεταξύ τους. Το όνομα του πρώτου ατόμου στον πληθυσμό είναι 'Sample 1' (2η στήλη στο pop_A). Το όνομα του 2ου ατόμου στον πληθυσμό είναι Sample 2 (3η στήλη στο pop_A), κτλ.

Άσκηση 38

Ένας πληθυσμός με το όνομα Α αποτελείται από 20 ανθρώπους. Σε αυτούς τους ανθρώπους κάναμε γονοτύπηση σε 10 γενετικούς τόπους. Όλοι οι γονότυποι είναι δι-αλληλικοί (biallelic). Κάθε ένας από τους 10 γενετικούς τόπους έχει όνομα Μ1, Μ2, ... Μ10. Τα αποτελέσματα που πήραμε υπάρχουν σε αυτή τη λίστα:

pop_A = [
   ['M1', 'Aa', 'Aa', 'Aa', 'aa', 'aA', 'aa', 'Aa', 'aa', 'aa', 'aa', 'aA', 'Aa', 'Aa', 'Aa', 'AA', 'aa', 'Aa', 'aA', 'aa', 'aA'], 
   ['M2', 'Bb', 'Bb', 'bb', 'bB', 'bb', 'bb', 'bb', 'bb', 'bb', 'Bb', 'bB', 'bb', 'bB', 'bb', 'bb', 'bb', 'Bb', 'bb', 'BB', 'BB'], 
   ['M3', 'cc', 'cC', 'cc', 'cc', 'Cc', 'cc', 'cC', 'CC', 'cc', 'cc', 'cC', 'Cc', 'cc', 'cC', 'cc', 'cc', 'cC', 'cc', 'cc', 'cc'], 
   ['M4', 'dd', 'dd', 'DD', 'dD', 'dd', 'dd', 'dd', 'Dd', 'dd', 'dD', 'DD', 'dd', 'dd', 'dd', 'Dd', 'dd', 'dD', 'dd', 'dd', 'dD'], 
   ['M5', 'ee', 'Ee', 'ee', 'ee', 'eE', 'ee', 'ee', 'eE', 'Ee', 'ee', 'ee', 'ee', 'ee', 'Ee', 'ee', 'ee', 'ee', 'eE', 'ee', 'Ee'], 
   ['M6', 'FF', 'ff', 'Ff', 'ff', 'ff', 'ff', 'Ff', 'FF', 'ff', 'Ff', 'Ff', 'FF', 'ff', 'ff', 'ff', 'ff', 'ff', 'ff', 'ff', 'FF'], 
   ['M7', 'Gg', 'Gg', 'gG', 'gG', 'gG', 'gG', 'Gg', 'gG', 'gG', 'gG', 'Gg', 'gG', 'Gg', 'gG', 'gg', 'gG', 'gG', 'gg', 'gG', 'GG'], 
   ['M8', 'HH', 'hh', 'Hh', 'hh', 'hH', 'hh', 'Hh', 'hh', 'HH', 'hh', 'Hh', 'hH', 'Hh', 'Hh', 'hh', 'Hh', 'hH', 'hH', 'HH', 'hH'], 
   ['M9', 'Ii', 'II', 'ii', 'iI', 'ii', 'ii', 'II', 'ii', 'Ii', 'iI', 'iI', 'ii', 'Ii', 'ii', 'ii', 'iI', 'iI', 'Ii', 'ii', 'iI'], 
   ['M10', 'jJ', 'jj', 'jj', 'Jj', 'jJ', 'Jj', 'jj', 'jj', 'jj', 'jj', 'jj', 'jj', 'jj', 'jj', 'jj', 'jJ', 'jJ', 'Jj', 'Jj', 'Jj']]

Εδώ παρατηρούμε ότι τα αλλήλια κάθε μετάλλαξης τα συμβολίζουμε με το ίδιο γράμμα κεφαλαίο ή μικρό. Όταν το γράμμα είναι κεφαλαίο σημαίνει ότι έχουμε το πρωτεύον αλλήλιο. Όταν το γράμμα είναι μικρό σημαίνει ότι έχουμε το δευτερεύον αλλήλιο. Επίσης ένας γονότυπος αποτελείται απο 2 γράμματα. Για παράδειγμα:

  • FF σημείνει ότι για τη μετάλλαξη Μ6 το δείγμα αυτό είναι ομόζυγο στο πρωτεύον αλλήλιο.
  • Ff σημείνει ότι για τη μετάλλαξη Μ6 το δείγμα αυτό είναι ετερόζυγο.
  • fF σημείνει ότι για τη μετάλλαξη Μ6 το δείγμα αυτό είναι ετερόζυγο.
  • ff σημείνει ότι για τη μετάλλαξη Μ6 το δείγμα αυτό είναι ομόζυγο στο δευτερεύον αλλήλιο.

Γράψτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος αυτή θα είναι μία λίστα όπως η pop_A. Η συνάρτηση θα επιστρέφει False αν:

  • Υπάρχει έστω ένας γονότυπος που δεν αποτελείται από 2 γράμματα (π.χ. aaa ή a)
  • Υπάρχει έστω ένας γονότυπος που δεν περιέχει το ίδιο γράμμα κεφαλαίο ή μικρό (π.χ. aB)
  • Υπάρχουν δύο γονότυποι που ανήκουν στην ίδια μετάλλαξη και δεν περιέχουν το ίδιο γράμμα κεφαλαίο ή μικρό. Για παράδειγμα η παρακάτω μετάλλαξη δεν είναι σωστή (οι τελευταίοι 2 γονότυποι περιέχουν τα γράμματα G και g, συνεπώς δεν περιέχουν όλοι οι γονότυποι αυτής της μετάλλαξης το ίδιο γράμμα):
['M8', 'HH', 'hh', 'Hh', 'hh', 'hH', 'hh', 'Hh', 'hh', 'HH', 'hh', 'Hh', 'hH', 'Hh', 'Hh', 'hh', 'Hh', 'hH', 'hH', 'GG', 'gG'], 
  • Υπάρχουν 2 μεταλλάξεις που περιέχουν τα ίδια γράμματα. Για παράδειγμα:
pop_A = [
   ['M1', 'Aa', 'Aa', 'Aa', 'aa', 'aA', 'aa', 'Aa', 'aa', 'aa', 'aa', 'aA', 'Aa', 'Aa', 'Aa', 'AA', 'aa', 'Aa', 'aA', 'aa', 'aA'], 
   ['M2', 'Aa', 'Aa', 'Aa', 'aa', 'aA', 'aa', 'Aa', 'aa', 'aa', 'aa', 'aA', 'Aa', 'Aa', 'Aa', 'AA', 'aa', 'Aa', 'aA', 'aa', 'aA'], 
   ['M3', 'cc', 'cC', 'cc', 'cc', 'Cc', 'cc', 'cC', 'CC', 'cc', 'cc', 'cC', 'Cc', 'cc', 'cC', 'cc', 'cc', 'cC', 'cc', 'cc', 'cc'], 
   ['M4', 'dd', 'dd', 'DD', 'dD', 'dd', 'dd', 'dd', 'Dd', 'dd', 'dD', 'DD', 'dd', 'dd', 'dd', 'Dd', 'dd', 'dD', 'dd', 'dd', 'dD'], 
   ['M5', 'ee', 'Ee', 'ee', 'ee', 'eE', 'ee', 'ee', 'eE', 'Ee', 'ee', 'ee', 'ee', 'ee', 'Ee', 'ee', 'ee', 'ee', 'eE', 'ee', 'Ee'], 
   ['M6', 'FF', 'ff', 'Ff', 'ff', 'ff', 'ff', 'Ff', 'FF', 'ff', 'Ff', 'Ff', 'FF', 'ff', 'ff', 'ff', 'ff', 'ff', 'ff', 'ff', 'FF'], 
   ['M7', 'Gg', 'Gg', 'gG', 'gG', 'gG', 'gG', 'Gg', 'gG', 'gG', 'gG', 'Gg', 'gG', 'Gg', 'gG', 'gg', 'gG', 'gG', 'gg', 'gG', 'GG'], 
   ['M8', 'HH', 'hh', 'Hh', 'hh', 'hH', 'hh', 'Hh', 'hh', 'HH', 'hh', 'Hh', 'hH', 'Hh', 'Hh', 'hh', 'Hh', 'hH', 'hH', 'HH', 'hH'], 
   ['M9', 'Ii', 'II', 'ii', 'iI', 'ii', 'ii', 'II', 'ii', 'Ii', 'iI', 'iI', 'ii', 'Ii', 'ii', 'ii', 'iI', 'iI', 'Ii', 'ii', 'iI'], 
   ['M10', 'jJ', 'jj', 'jj', 'Jj', 'jJ', 'Jj', 'jj', 'jj', 'jj', 'jj', 'jj', 'jj', 'jj', 'jj', 'jj', 'jJ', 'jJ', 'Jj', 'Jj', 'Jj'],
]

Οι μεταλλάξεις Μ1 και Μ2 περιέχουν τα ίδια γράμματα (Α και a).

Αν δεν συμβαίνει τίποτα από τα παραπάνω τότε η συνάρτηση επιστρέφει True.

Άσκηση 39

Γράψτε μία συνάρτηση η οποία θα παίρνει σαν είσοδο μία λίστα με τη παρακάτω δομή:

pop_A = [
    ['M1', 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0], 
    ['M2', 2, 1, 0, 0, 0, 2, 1, 0, 2, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 2, 0, 0, 1, 0], 
    ['M3', 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 1, 0, 1, 0, 0, 0, 0, 1, 2, 0, 2], 
    ['M4', 0, 0, 0, 2, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 1, 1], 
    ['M5', 1, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 0, 0, 2, 1, 1, 0, 1, 2, 2, 1], 
    ['M6', 1, 0, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 2, 0, 1, 1, 1, 0, 0, 0], 
    ['M7', 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 2, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0], 
    ['M8', 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 2, 0, 1, 0, 1, 0, 0, 2], 
    ['M9', 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 2, 1, 0, 1, 1, 1], 
    ['M10', 0, 1, 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 2, 2, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0],
]

H συνάρτηση θα πρέπει να περιστρέφει αυτή τη λίστα δεξιόστροφα. Δηλαδή θα πρέπει:

f(pop_A) # Επιστρέφει:
[
    ['M1', 'M2', 'M3', 'M4', 'M5', 'M6', 'M7', 'M8', 'M9', 'M10'], 
    [0, 2, 0, 0, 1, 1, 1, 0, 1, 0], 
    [1, 1, 1, 0, 0, 0, 0, 0, 0, 1], 
    [0, 0, 2, 0, 1, 2, 0, 0, 0, 1], 
    [0, 0, 0, 2, 2, 0, 0, 0, 0, 0], 
    [0, 0, 0, 2, 1, 0, 1, 0, 0, 0], 
    [1, 2, 0, 0, 0, 2, 0, 0, 2, 0], 
    [0, 1, 0, 0, 0, 1, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0, 1, 0, 0], 
    [1, 2, 0, 0, 0, 0, 1, 0, 0, 0], 
    [0, 1, 0, 1, 0, 0, 1, 0, 0, 2], 
    [0, 0, 0, 1, 0, 0, 0, 0, 0, 1], 
    [1, 1, 2, 0, 2, 0, 1, 0, 0, 0], 
    [0, 1, 2, 0, 2, 1, 1, 0, 0, 2], 
    [0, 0, 1, 0, 0, 1, 2, 1, 0, 2], 
    [0, 0, 1, 0, 2, 1, 0, 1, 1, 0], 
    [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 1, 0, 0, 1, 1, 0, 1, 1], 
    [0, 0, 0, 0, 2, 2, 0, 2, 0, 0], 
    [1, 1, 0, 1, 1, 0, 1, 0, 1, 0], 
    [1, 0, 0, 2, 1, 1, 0, 1, 2, 2], 
    [1, 2, 0, 1, 0, 1, 0, 0, 1, 0], 
    [0, 0, 1, 0, 1, 1, 0, 1, 0, 0], 
    [0, 0, 2, 0, 2, 0, 0, 0, 1, 0], 
    [0, 1, 0, 1, 2, 0, 1, 0, 1, 0], 
    [0, 0, 2, 1, 1, 0, 0, 2, 1, 0],
]

Άσκηση 40

Η λίστα:

genes = ['Gene_1', 'Gene_2', 'Gene_3', 'Gene_4', 'Gene_5', 'Gene_6', 'Gene_7', 'Gene_8', 'Gene_9', 'Gene_10']

Περιέχει τα ονόματα από 10 γονίδια.

H λίστα:

interesting = [3,0,4,7]

Περιέχει τα indexes των γονιδίων που θεωρούμε "ενδιαφέρον". Δηλαδή οι τιμές [3,0,4,7] σημαίνουν ότι θεωρούμε ενδιαφέρον το 4ο (Gene_4), το 1ο (Gene_1), το 5ο (Gene_5) και το 8ο (Gene_8).

Τελος η λίστα:

sizes = [2957, 8379, 9365, 5377]

περιέχει τα μεγέθη των γονιδίων που θεωρούμε ενδιαφέρον. Για παράδειγμα το γονίδιο Gene_4 έχει μέγεθος 2957, το γονίδιο Gene_1 έχει μέγεθος 8379, το γονίδιο Gene_5 έχει μέγεθος 9365 και το γονίδιο Gene_8 έχει μέγεθος 5377.

Φτιάξτε μία συνάρτηση η οποία θα παίρνει τρεις παράμετρους. Οι παράμετροι θα είναι 3 λίστες όπως οι genes, interesting, sizes. Η συνάρτηση θα επιστρέφει μία λίστα η οποία θα περιέχει τα ονόματα των γονιδίων που είναι ενδιαφέροντα και έχουν μήκος μεγαλύτερο από 6000. Για παράδειγμα θα πρέπει:

f(genes, interesting, sizes)
# Επιστρέφει: ['Gene_1', 'Gene_5']

Άσκηση 41

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο δύο dictionaries a,b. Η συνάρτηση θα επιστρέφει ένα νεό dictionary το οποία θα έχει τα ίδια κλειδιά με το a. Οι τιμή του ενός κλειδιού k θα υπολογίζονται ως εξής:

  • Αν το b έχει κλειδί ίδιο με τη τιμή του a στο κλειδί k, τότε η τιμη του dictionary που θα επιστρέφει η συνάρτηση στο κλειδί k θα είναι η τιμή του b στο κλειδί k.
  • Αν το b δεν έχει κλειδί ίδιο με τη τιμή του a στο κλειδί k, τότε η τιμη του dictionary που θα επιστρέφει η συνάρτηση στο κλειδί k θα είναι η τιμή του a στο κλειδί k.

Για παράδειγμα:

a = {
    'a': 1,
    'b': 2,
    'c': 3,
}

b = {
    1: 'mitsos',
    3: 'kostas',
    4: 'maria',
}

f(a,b) 
#Επιστρέφει:
{
    'a' : 'mitsos', # to 1 υπάρχει στο b
    'b': 2,         # to 2 ΔΕΝ υπάρχει στο b
    'c': 'kostas',  # το 3 υπάρχει στο b
}

Άσκηση 42

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο μία λίστα από dictionaries a. Η συνάρτηση θα επιστρέφει ένα dictionary όπου οι τιμές θα είναι η ένωση (προσοχή! όχι η τομή) όλων των κλειδιών των dictionaries της a. Οι τιμές θα είναι ο μέσος όρος όλων των τιμών των dictionaries του a για τα υποία υπάρχει το κάθε κλειδί. Για παράδειγμα:

a = [ 
   {'a':1, 'b': 2, 'c': 3, 'd': 4, 'e': 5},
   {'a':1, 'b': 2, 'c': 2, 'd': 6},
   { 'c': 4, 'd': 2, 'e': 8},
]

f(a) 
# Επιστρέφει:
{
    'a' : 1.0, # (1+1)/2,
    'b': 2.0, # (2+2)/2,
    'c' : 3.0, # (3+2+4)/3
    'd': 4.0, # (4+6+2)/3
    'e': 6.5, # (5+8)/2
}

Άσκηση 43

Φτιάξτε μία συνάρτηση η οποία δεν θα παίρνει καμία παράμετρο. Η συνάρτηση θα επιστρέφει ένα dictionary όπου:

  • Τα κλειδιά (keys) θα είναι όλοι οι αριθμοί από το 1 μέχρι και το 999.
  • Οι τιμές (values) θα είναι ένα dictionary {'lower': X, 'greater': Y}. Όπου:
    • Χ θα είναι το πλήθος από πρώτους αριθμούς που είναι μικρότεροι από το κλειδί και μεγαλύτεροι ή ίσοι με το 1.
    • Υ θα είναι το πλήθος από πρώτους αριθμούς που είναι μεγαλύτεροι από το κλειδί και μικρότεροι ή ίσοι με το 1000.

Για παράδειγμα θα πρέπει:

a = f()
print (aa[500])
#  Τυπώνει:
{'lower': 96, 'greater': 73}

δηλαδή:

  • υπάρχουν 96 πρώτοι αριθμοί η οποίοι είναι μεγαλύτεροι ή ίσοι με το 1 και μικρότεροι από το 500.
  • υπάρχουν 73 πρώτοι αριθμοί η οποίοι είναι μεγαλύτεροι από το 500 και μικρότεροι ή ίσοι με το 1000.

Άσκηση 44

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο 3 dictionaries: a,b,c. Η συνάρτηση θα επιστρέφει ένα dictionary. To dictionary αυτό θα έχει όλα κλειδιά του a. Για κάθε κλειδί του dictionary η αντίστοιχη τιμή θα είναι ένα dictionary του τύπου: {'Χ': Κ, 'Υ': L}, όπου: Κ είναι η τιμή του b στο αντίστοιχο κλειδί του a και L είναι η τιμή του c στο αντίστοιχο κλειδί του a. Για παράδειγμα θα πρέπει:

a = {'a':'k', 'b': 'l', 'c':'m'}
b = {'k':1, 'l': 2, 'm': 3}
c = {'k':5, 'l': 6, 'm': 7}

d = f(a,b,c)
print (d)
# Τυπώνει:
{
 'a': {'X':1, 'Y':5},
 'b': {'X':2, 'Y':6},
 'c': {'X':3, 'Y':7},
}

Θεωρούμε ότι πάντα υπάρχουν όλα τα κλειδιά του a στα b,c. Δεν χρειάζεται να το ελέγξετε αυτό.

Άσκηση 45

Το παρακάτω string:

s = '''
European            301226   C=0.877086  T=0.122914
African              11718   C=0.96604   T=0.03396
African_Others         410   C=0.995     T=0.005
African_American     11308   C=0.96498   T=0.03502
Asian                 3982   C=0.1675    T=0.8325
East_Asian            3180   C=0.0547    T=0.9453
Other_Asian            802   C=0.615     T=0.385
Latin_American_1      1426   C=0.9060    T=0.0940
Latin_American_2      3176   C=0.8196    T=0.1804
South_Asian           5226   C=0.6033    T=0.3967
Other                20444   C=0.85174   T=0.14826
'''

Περιέχει τις αλληλικές συχνότητες σε διάφορους πληθυσμούς για μία μετάλλαξη (συγκεκριμένα αυτή).

  • Η 1η στήλη είναι το όνομα του πληθυσμού
  • Η 2η στήλη είναι το μέγεθος του πληθυσμού
  • Η 3η στήλη είναι το πρωτεύον αλλήλιο μαζί με την αλληλική συχνότητά του
  • Η 4η στήλη είναι το δευτερεύον αλλήλιο μαζί με την αλληλική συχνότητά του.

Φτιάξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. H παράμετρος θα είναι ένα string όπως το s. Η συνάρτηση θα επιστρέφει ένα dictionary.

  • Τα κλειδιά θα είναι η πρώτη στήλη, δηλαδή το όνομα του πληθυσμού.
  • Οι τιμές θα είναι ένα dictionary όπου τα κλειδιά θα είναι τα ονόματα των αλληλίων και οι τιμές θα είναι οι αντίστοιχες συχνότητες.

Για παράδειγμα θα πρέπει:

print (f(s))
# Τυπώνει:
{'European': {'C': 0.877086, 'T': 0.122914},
 'African': {'C': 0.96604, 'T': 0.03396},
 'African_Others': {'C': 0.995, 'T': 0.005},
 'African_American': {'C': 0.96498, 'T': 0.03502},
 'Asian': {'C': 0.1675, 'T': 0.8325},
 'East_Asian': {'C': 0.0547, 'T': 0.9453},
 'Other_Asian': {'C': 0.615, 'T': 0.385},
 'Latin_American_1': {'C': 0.906, 'T': 0.094},
 'Latin_American_2': {'C': 0.8196, 'T': 0.1804},
 'South_Asian': {'C': 0.6033, 'T': 0.3967},
 'Other': {'C': 0.85174, 'T': 0.14826}
}

Άσκηση 46

Γράψτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο 2 λίστες με ακέραιους αριθμούς α,β. Η συνάρτηση θα επιστρέφει το μεγαλύτερο πλήθος από συνεχόμενα στοιχεία για τα οποία η α έχει μικρότερους αριθμούς από τη β.

Για παράδειγμα έστω:

a = [1, 8, 7, 1, 8, 5, 3, 7, 1, 1]
b = [5, 4, 6, 7, 10, 2, 9, 10, 5, 8]

Θα πρέπει:

print (f(a,b)) # Τυπώνει 4

Επεξήγηση: Με Χ σημειώνω τις θέσεις όπου τα στοιχεία της a είναι μικρότερα από τα αντίστοιχα στοιχεία της b:


X     X X    X  X X X
1 8 7 1 8  5 3  7 1 1]
5 4 6 7 10 2 9 10 5 8]

Το μεγαλύτερο πλήθος από συνεχόμενα X είναι 4 (τελευταίες 4 θέσεις).

Hint: https://stackoverflow.com/questions/7025581/how-can-i-group-equivalent-items-together-in-a-python-list

Άσκηση 47

Γράψτε μία συνάρτηση η οποία δεν θα παίρνει καμία παράμετρο. Η συνάρτηση θα επιστρέφει έναν ακέραιο αριθμό ο οποίος θα είναι η απάντηση στο παρακάτω ερώτημα: Αν αρχίσω και προσθέτω όλους τους πρώτους αριθμούς ξεκινώντας από το 1 (1+2+3+5+7+11+...) και σταματήσω όταν αυτό το άθροισμα ξεπεράσει το 1.000.000, πόσους αριθμούς θα έχω προσθέσει; Προσοχή μην επιστρέψετε το άθροισμα αλλά το πλήθος των αριθμών που θα έχετε προσθέσει.

Άσκηση 48

Γράψτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο έναν ακέραιο αριθμό x, μεγαλύτερος του 10 (δεν χρειάζεται να το ελέγχετε αυτό). Η συνάρτηση θα επιστρέφει τη λύση στο ερώτημα ποιος είναι ο μικρότερο ακέραιος αριθμός n τέτοιος ώστε χ1/(2n) < 1.5.

Hint:

import math

math.sqrt(n) # --> n^(1/2)
math.sqrt(math.sqrt(n)) # --> n^(1/4)
math.sqrt(math.sqrt(math.sqrt(n))) # --> n^(1/8)
...

Δίνεται:

f(100) # Επιστρέφει 4
f(10_000) # Επιστρέφει 5
f(10_000_000_000_000_000) # Επιστρέφει 7

Άσκηση 49

Ένας από τους μαθηματικούς τύπους για τον υπολογισμό του π (3.14159....) είναι:

img

Οι παρανομαστές στα κλάσματα είναι οι περιττοί (μονοί) αριθμοί (μην τους μπερδέψετε με τους πρώτους).

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο έναν ακέραιο αριθμό n. Η συνάρτηση θα επιστρέφει μία προσέγγιση του π, χρησιμοποιώντας n όρους από την παραπάνω ακολουθία.

Άσκηση 50

Δίνεται το παρακάτω dictionary με τη θέση που τερμάτισαν οι οδηγοί της formula 1 σε όλους τους αγώνες του 2020. Το κλειδί του dictionary περιέχει το όνομα του οδηγού. Η λίστα που έχει το κάθε κλειδί περιέχει τη θέση που τερμάτισαν οι οδηγοί σε κάθε έναν από τους 17 αγώνες. Η τιμή 0 σημαίνει ότι ο συγκεκριμένος οδηγός δεν τερμάτισε σε αυτόν τον αγώνα.

f1 = {
 'Valtteri Bottas': [1, 2, 3, 11, 3, 3, 2, 5, 2, 1, 0, 2, 2, 14, 8, 8, 2],
 'Daniil Kvyat': [12, 10, 12, 0, 10, 12, 11, 9, 7, 8, 15, 19, 4, 12, 11, 7, 11],
 'Kimi Räikkönen': [0, 11, 15, 17, 15, 14, 12, 13, 9, 14, 12, 11, 9, 15, 15, 14, 12], 
 'Pierre Gasly': [7, 15, 0, 7, 11, 9, 8, 1, 0, 9, 6, 5, 0, 13, 6, 11, 8],
 'Kevin Magnussen': [0, 12, 10, 0, 0, 15, 17, 0, 0, 12, 13, 16, 0, 17, 17, 15, 18],
 'Lewis Hamilton': [4, 1, 1, 1, 2, 1, 1, 7, 1, 3, 1, 1, 1, 1, 1, 0, 3],
 'Carlos Sainz Jr.': [5, 9, 9, 13, 13, 6, 0, 2, 0, 0, 5, 6, 7, 5, 5, 4, 6],
 'Max Verstappen': [0, 3, 2, 2, 1, 2, 3, 0, 0, 2, 2, 3, 0, 6, 2, 0, 1],
 'Sergio Pérez': [6, 6, 7, 0, 0, 5, 10, 10, 5, 4, 4, 7, 6, 2, 18, 1, 0],
 'Charles Leclerc': [2, 0, 11, 3, 4, 0, 14, 0, 8, 6, 7, 4, 5, 4, 10, 0, 13],
 'Antonio Giovinazzi': [9, 14, 17, 14, 17, 16, 0, 16, 0, 11, 10, 15, 10, 0, 16, 13, 16],
 'Alexander Albon': [13, 4, 5, 8, 5, 8, 6, 15, 3, 10, 0, 12, 15, 7, 3, 6, 4],
 'Daniel Ricciardo': [0, 8, 8, 4, 14, 11, 4, 6, 4, 5, 3, 9, 3, 10, 7, 5, 7],
 'Sebastian Vettel': [10, 0, 6, 10, 12, 7, 13, 0, 10, 13, 11, 10, 12, 3, 13, 12, 14],
 'Lando Norris': [3, 5, 13, 5, 9, 10, 7, 4, 6, 15, 0, 13, 8, 8, 4, 10, 5],
 'Pietro Fittipaldi': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 19],
 'George Russell': [0, 16, 18, 12, 18, 17, 0, 14, 11, 18, 0, 14, 0, 16, 12, 9, 15],
 'Romain Grosjean': [0, 13, 16, 16, 16, 19, 15, 12, 12, 17, 9, 17, 14, 0, 0, 0, 0],
 'Lance Stroll': [0, 7, 4, 9, 6, 4, 9, 3, 0, 0, 0, 0, 13, 9, 0, 3, 10],
 'Nicholas Latifi': [11, 17, 19, 15, 19, 18, 16, 11, 0, 16, 14, 18, 11, 0, 14, 0, 17],
 'Jack Aitken': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0],
 'Nico Hülkenberg': [0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0], 
 'Esteban Ocon': [8, 0, 14, 6, 8, 13, 5, 8, 0, 7, 0, 8, 0, 11, 9, 2, 9],
}

Για παράδειγμα, ο οδηγός Lando Norris στον 1ο αγώνο τερμάτισε 3ος, στον 2ο αγώνα τερμάτισε 5ος και στον τελευταίο αγώνα τερμάτισε 5ος. O Pietro Fittipaldi δεν τερμάτισε σε κανένα αγώνα εκτός από τους 2 τελευταίους.

Δίνεται επίσης το παρακάτω dictionary:

points = {
 1: 25,
 2: 18,
 3: 15,
 4: 12,
 5: 10,
 6: 8,
 7: 6,
 8: 4,
 9: 2,
 10: 1,
}

Το dictionary αυτό περιέχει τους πόντους που παίρνει κάθε οδηγός ανάλογα με τη θέση που τερματίζει σε κάθε αγώνα. Για παράδειγμα ο 1ος παίρνει 25 πόντους, ο 2ος παίρνει 18 πόντους και ο 3ος παίρνει 15 πόντους. Οι οδηγοί που τερματίζουν από την 11 θέση και μετά δεν παίρνουν κανένα πόντο.

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν όρισμα δύο dictionaries. Το 1ο dictionary θα έχει δομή παρόμοια με το f1 και το 2ο θα έχει δομή παρόμοια με το points. Η συνάρτηση θα επιστρέφει το όνομα του οδηγού που έχει συγκεντρώσει τους περισσότερους πόντους σε όλους τους αγώνες. Για παράδειγμα θα πρέπει:

f(f1, points) # Επιστρέφει: 'Lewis Hamilton'

Σημείωση: αν υπάρχει ισοπαλία ανάμεσα στους πρώτους, τότε θα επιστρέφει το όνομα ενός από τους πρώτους οδηγούς. Επιλέξτε με όποιον τρόπο θέλετε εσείς.

Άσκηση 51

Δίνεται η παρακάτω συνάρτηση:

import requests
def get_pi_1M():
    r = requests.get('https://www.angio.net/pi/digits/pi1000000.txt')
    return r.text

Αυτή η συνάρτηση επιστρέφει ένα string το οποίο περιέχει το π (3.14159...) στις πρώτες 1.000.000 θέσεις. Γράψτε μία συνάρτηση η οποία δεν θα παίρνει καμία παράμετρο. Η συνάρτηση θα επιστρέφει ένα string το οποίο θα είναι η μεγαλύτερη υπο-ακολουθία από συνεχόμενους άρτιους (ζυγούς) αριθμούς που υπάρχουν στα πρώτα 1.000.000 ψηφία του π.

Άσκηση 52

Φτιαξτε μία συνάρτηση η οποία θα δέχεται σαν παράμετρο έναν ακέραιο αριθμό n. Η συνάρτηση δεν θα επιστρέφει τίποτα. Η συνάρτηση θα τυπώνει το παρακάτω:

Για n==1

1

Για n==2

1
2 3

Για n==3

1
2 3
6 5 4

Για n==4

1
2 3
6 5 4
7 8 9 10

Για n==5

1
2 3
6 5 4
7 8 9 10
15 14 13 12 11

Η συνάρτηση θα πρέπει να τυπώνει ένα παρόμοιο pattern για οποιoδήποτε n>0

Άσκηση 53

Γράψτε κώδικα python τέτοιον ώστε όταν γράφω:

f['mitsos']('mitsos')['mitsos']('mitsos')

Να επιστρέφει (guess what..): mitsos.

Άσκηση 54

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο ένα string. To string θα είναι της μορφής:

AAA=BBB;CCC=DDD;EEE=FFF;GGG=HHH

Η συνάρτηση θα επιστρέφει ένα dictionary όπου κάθε ζευγάρι κλειδί/τιμή θα είναι το αριστερό και το δεξί μέρος κάθε = σε αυτό το string. Για παράδειγμα θα πρέπει:

a = 'AAA=BBB;CCC=DDD;EEE=FFF;GGG=HHH'
f(a) # Επιστρέφει:
{
  'AAA': 'BBB',
  'CCC': 'DDD',
  'EEE': 'FFF',
  'GGG': 'HHH',
}

Ένα άλλο παράδειγμα:

a = '''ALLELEID=1003021;CLNDISDB=MedGen:CN517202;CLNDN=not_provided;CLNHGVS=NC_000001.10:g.861332G>A;CLNREVSTAT=criteria_provided,_single_submitter;CLNSIG=Uncertain_significance;CLNVC=single_nucleotide_variant;CLNVCSO=SO:0001483;GENEINFO=SAMD11:148398;MC=SO:0001583|missense_variant;ORIGIN=1'''
f(a) # Επιστρέφει:

{
  'ALLELEID': '1003021', 
  'CLNDISDB': 'MedGen:CN517202', 
  'CLNDN': 'not_provided',
  'CLNHGVS': 'NC_000001.10:g.861332G>A',
  'CLNREVSTAT': 'criteria_provided,_single_submitter', 
  'CLNSIG': 'Uncertain_significance', 
  'CLNVC': 'single_nucleotide_variant', 
  'CLNVCSO': 'SO:0001483', 
  'GENEINFO': 'SAMD11:148398', 
  'MC': 'SO:0001583|missense_variant',
  'ORIGIN': '1'
}

Άσκηση 55

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο ένα string. To string θα είναι της μορφής:

AAA=BBB,CCC,DDD;EEE=FFF,GGG;EEE=HHH,III,JJJ,KKK;LLL=HHH

Η συνάρτηση θα επιστρέφει ένα dictionary όπου κάθε ζευγάρι κλειδί/τιμή θα είναι το αριστερό και το δεξί μέρος κάθε = σε αυτό το string. Τα values του dictionaries θα είναι μία λίστα με όλες τις τιμές που διαχωρίζονται με ,. Για παράδειγμα θα πρέπει:

a = 'AAA=BBB,CCC,DDD;EEE=FFF,GGG;HHH=KKK,LLL,MMM,NNN;OOO=PPP'
f(a) # Επιστρέφει:

{
  'AAA': ['BBB', 'CCC', 'DDD'], 
  'EEE': ['FFF', 'GGG'], 
  'HHH': ['KKK', 'LLL', 'MMM', 'NNN'], 
  'OOO': ['PPP']
}

Άσκηση 56

Έστω το string:

a = '''
A = 111
B = 222
A = 333
A = 444
C = 555
C = 666
'''

Γράψτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο ένα string με τη μορφή του a. Η συνάρτηση πρέπει να επιστρέφει ένα dictionary. Τα κλειδιά του dictionary θα είναι οι τιμές που υπάρχουν στην αριστερή πλευρά του κάθε =. Οι τιμές του dictionary θα είναι λίστες οι οποίες θα περιέχουν όλα τα strings που ανήκουν στη δεξιά πλευρά του κάθε = του κάθε κλειδιού. Για παράδειγμα θα πρέπει:

f(a)
# Επιστρέφει:
{
  'A': ['111', '333', '444'],
  'B': ['222'],
  'C': ['555', '666'],
}

Άσκηση 57

Έστω η παρακάτω λίστα a:

a = 
[
  [
    ['AAA', 1],
    ['BBB', 2],
    ['CCC', 3],
  ],

  [
    ['DDD', 2],
    ['EEE', 2],
    ['FFF', 1],
  ],

  [
    ['GGG', 2],
    ['HHH', 3],
    ['III', 1],
    ['ΚΚΚ', 1],
  ],
]

Φτιάξτε μία συνάρτηση η οποία θα παίρνει δύο παράμετρους. Η πρώτη θα είναι μία λίστα με δομή όπως η a. H δεύτερη θα είναι ένας ακέραιος αριθμός b. Η συνάρτηση θα επιστρέφει μία λίστα με τις υπο-λίστες της a που το δεύτερο στοιχείο τους είναι ίσο με το β. Για παράδειγμα θα πρέπει:

f(a, 2)
# Επιστρέφει:
[
    ['BBB', 2],
    ['DDD', 2],
    ['EEE', 2],
    ['GGG', 2],
]


f(a, 1)
# Επιστρέφει:
[
  ['AAA', 1],
  ['FFF', 1],
  ['III', 1],
  ['ΚΚΚ', 1],
]

Άσκηση 58

Φτιάξτε μία συνάρτηση η οποία δεν θα παίρνει κανένα όρισμα. Η συνάρτηση πρέπει να επιστρέφει μία λίστα με όλους τους αριθμούς από το 1 μέχρι το 100 ταξινομημένους ανάλογα με το πλήθος των ακέραιων διαιρέτων τους. Η ταξινόμηση πρέπει να γίνει ξεκινώντας από το μικρότερο πλήθος από διαιρέτες και καταλήγοντας στο μεγαλύτερο. Αν δύο αριθμοί έχουν το ίδιο πλήθος από διαιρέτες τότε πρώτα στη λίστα θα πρέπει να υπάρχει ο μικρότερος αριθμός.

Είναι δική σας επιλογή αν το 1 ή ο ίδιος ο αριθμός θα πρέπει να είναι μέσα στους διαιρέτες. Αυτό δεν πρόκειται να αλλάξει το αποτέλεσμα.

Άσκηση 59

Δίνεται η παρακάτω λίστα:

l = [
 '7ae92b8fac7bded',
 'ba2afb3a2fbed33',
 'f4bfa6dd95cda8d',
 '2f52ee1beaf2ebb',
 'abd6faf4fc568ce',
 'fe53c676ddebdbb',
 'ebadabdb48f2d87',
 'd8abc6db9c47afc',
 'ba65c1eabdce1e3',
 'bbe5ffb694ed6cb',
 'ce5e84be74adaea',
 '6deebfbfd369e5a',
 'e6eba5cefdc291a',
 'ebc39fe1dbc3fc5',
 '681fbb5bf8ddccc',
 '7b32fb4dafefde3',
 'a76dfee3e6cf1cb',
 '7bef1f12ebef1af',
 'bdcc23ecce97e2b',
 'bacaa6b43d17dea',
]

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο μία λίστα με strings (όπως η l). Η συνάρτηση θα επιστρέφει το στοιχείο της λίστας με το μικρότερο γινόμενο. Ως γινόμενο ορίζουμε τον αριθμό που προκύπτει αν πολλαπλασιάσουμε όλα τα γράμματα του string που είναι αριθμοί.

Για παράδειγμα: το string ba2afb3a2fbed33 έχει γινόμενο 108:

ba2afb3a2fbed33
  2   3 2    33

2*3*2*3*3 = 108  

Άσκηση 60

Έστω το παρακάτω string:

a = '''
A,B,C = 10
D,E = 20
F = 30
G,H = 40
'''

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο ένα string όπως το a. Η συνάρτηση θα επιστρέφει ένα string όπου το κάθε στοιχείο ανάμεσα στα κόμματα θα είναι σε ξεχωριστή γραμμή με την αντίστοιχη τιμή. Θα πρέπει δηλαδή:

print (f(a))
# Τυπώνει:
A = 10
B = 10
C = 10
D = 20
E = 20
F = 30
G = 40
H = 40

Άσκηση 61

Φτιάξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο έστω p. Η παράμετρος θα είναι ένα αριθμός από το 0 μέχρι και το 100. Η συνάρτηση θα επιστρέφει το string:

  • Κεφάλι με πιθανότητα p%
  • Γράμματα με πιθανότητα (100-p)%

Άσκηση 62

Φτιάξτε μία συνάρτηση η οποία δεν θα παίρνει κανένα όρισμα. Η συνάρτηση:

  1. Περιέχει μία συνάρτηση η οποία δεν παίρνει καμία παράμετρο. Η συνάρτηση απλά ρίχνει 1 ζάρι 50 φορές και μετράει το ποσοστό που ήρθαν "6".
  2. Καλεί 100 φορές τη συνάρτηση του βηματος 1 και επιστρέφει τη διαφορά μεταξύ του μεγαλύτερου και του μικρότερου ποσοστού που επέστρεψε.

Άσκηση 63

Φτιάξτε μία συνάρτηση η οποία δεν θα παίρνει κανένα όρισμα. Η συνάρτηση:

  1. Θα περιέχει μία συνάρτηση η οποία δεν θα παίρνει κανένα όρισμα. Η συνάρτηση θα ρίχνει 2 ζάρια συνέχεια μέχρι να έρθουν εξάρες (6-6). Όταν έρθουν εξάρες η συνάρτηση θα επιστρέφει το πλήθος από τις φορές που έριξε τα ζάρια.
  2. Καλεί 1000 φορές της συνάρτηση του βήματος 1 και επιστρέφει τον μέσο όρο των τιμών που επέστρεψε.

Άσκηση 64

Ισχύει ότι: img

Όπου:

Φτιάξτε έναν generator o οποίος θα δέχεται μία παράμετρο, έστω χ. Ο generator θα παράγει τις τιμές τις παραπάνω ακολουθίας. Δηλαδή θα πρέπει:

g = gen(2) # x=2

print (next(g)) # Τυπώνει 1
print (next(g)) # Τυπώνει 2 (x)
print (next(g)) # Τυπώνει 2 (  (x^2)/(2!) )
print (next(g)) # Τυπώνει 1.3333333333333333 ( (x^3)/(3!))

Άσκηση 65

  1. Φτιάξτε έναν generator ο οποίος δεν θα παίρνει κανένα όρισμα. Ο generator θα κάνει yield τυχαίες τιμές από το 1 μέχρι το 10 εως ότου το άθροισμα των τιμών που έχει κάνει yield να φτάσει ή να ξεπεράσει το 100. O generator μπορεί να κάνει yield είτε ακέραιους είτε δεκαδικούς αριθμούς.
  2. Φτιάξτε μία συνάρτηση η οποία δεν θα παίρνει κανένα όρισμα. Η συνάρτηση δημιουργεί 100 φορές τον generator του βήματος 1 και μετράει το πλήθος από τιμές που έκανε generate ο κάθε ένας από τους 100. Η συνάρτηση επιστρέφει τον μέσο όρο αυτού του πλήθους.

Άσκηση 66

Φτιάξτε μία συνάρτηση η οποία παίρνει μία παράμετρο. Η παράμετρος θα είναι ένα string. Η συνάρτηση:

  • Αν η παράμετρος δεν είναι string θα πετάει TypeError exception
  • Αν η παράμετρος δεν περιέχει κάποιον αριθμό πετάει ValueError
  • Επιστρέφει τη μετατροπή του string σε αριθμό.

Για παράδειγμα:

f(100)  # Πετάει TypeError
f('mitsos') # Πετάει ValueError
 f('100') # Επιστρέφει: 100

Άσκηση 67

Δίνεται η παρακάτω συνάρτηση:

import random
def f():
  a = random.random()
  b = random.random()
  c = random.random()

  if a<b<c:
    raise ValueError
  
  raise TypeError

Φτιάξτε μία συνάρτηση η οποία δεν θα παίρνει καμία παράμετρο. Η συνάρτηση θα καλεί την f 11 φορές και θα μετράει πόσες φορές πέταξε ValueError και πόσες TypeError. Η συνάρτηση θα επιστρέφει:

  • True αν η συνάρτηση πέταξε ValueError τις περισσότερες φορές
  • False αν η συνάρτηση πέταξε TypeError τις περισσότερες φορές

Σημείωση: παρατηρήστε ότι αφού καλούμε την f 11 φορές (μονός) δεν γίνεται να πετάξει τον ίδιο αριθμό από ValueError και TypeError.

Άσκηση 68

Φτιάξτε μια συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι μία λίστα με αριθμούς. Η συνάρτηση θα επιστρέφει μία λίστα με τους αριθμούς της λίστας της παραμέτρου που υπάρχουν παραπάνω από μία φορά. Κάθε αριθμός θα πρέπει να υπάρχει το πολύ μία φορά στην λίστα που επιστρέφεται. Για παράδειγμα:

a = [3,4,2,5,4,3,1,6,7,7]
f(a)
# Επιστρέφει τους αριθμούς που υπάρχουν παραπάνω από μία φορά:
[3,4,7]

Άσκηση 69

Έστω το string:

a = '''
ABLIM3: encoding protein Actin-binding LIM protein 3
ADAMTS2: ADAM metallopeptidase with thrombospondin type 1 motif, 2
AGXT2: Alanine-glyoxylate aminotransferase 2
ANKRD31: encoding protein Ankyrin repeat domain 31
APBB3: encoding protein Amyloid beta A4 precursor protein-binding family B member 3
APC: adenomatosis polyposis coli
ARL15: encoding protein ADP-ribosylation factor-like 15
BRIX1: Ribosome biogenesis protein BRX1 homolog (also BXDC2)
C1QTNF3: Complement C1q tumor necrosis factor-related protein 3
FAM114A2: encoding protein FAM114A2
NREP: Neuronal regeneration related protein
FAM172A: encoding protein UPF0528 protein FAM172A
CPLANE1: Ciliogenesis And Planar Polarity Effector 1
CAST: Calpastatin
CPLX2: Complexin-2
CREBRF: encoding protein CREB3 regulatory factor
CXXC5: CXXC-type zing finger protein 5
DPYSL3: Dihydropyrimidinase-like protein 3
EGR1: early growth response protein 1
ERAP1: endoplasmic reticulum aminopeptidase 1 (previously called ARTS-1)
ERAP2: endoplasmic reticulum aminopeptidase 2
ESM1: Endothelial cell-specific molecule 1
DTDST: diastrophic dysplasia sulfate transporter
EIF4E1B: encoding protein Eukaryotic translation initiation factor 4E family member 1B
ERCC8: excision repair cross-complementing rodent repair deficiency, complementation group 8
FAM71B: encoding protein Family with sequence similarity 71 member B
FAM105B: encoding protein Family with sequence similarity 105, member B
FASTKD3: FAST kinase domain-containing protein 3
FBXL7: F-box/LRR-repeat protein 7
FCHSD1: FCH and double SH3 domain protein 1
FGF1: fibroblast growth factor 1 (acidic fibroblast growth factor)
FGFR4: fibroblast growth factor receptor 4
GM2A: GM2 ganglioside activator
GNPDA1: Glucosamine-6-phosphate isomerase 1
GPBP1: Vasculin
'''

Φτιάξτε έναν generator o οποίoς θα δέχεται μία παράμετρο. Η παράμετρος θα είναι ένα string με τη μορφή του a. Ο generator θα κάνει yield ένα dictionary με τα ακόλουθα κλειδια/τιμές:

  • Gene: το όνομα του κάθε γονιδίου του string της παραμέτρου
  • Description: τη περιγραφή του κάθε κάθε γονιδίου της παραμέτρου

Θα πρέπει δηλαδή:

g = gen(a)
print (next(g)) # Τυπώνει: {'Gene': 'ABLIM3', 'Description': 'encoding protein Actin-binding LIM protein 3'}
print (next(g)) # Τυπώνει: {'Gene': 'ADAMTS2': 'Description': 'ADAM metallopeptidase with thrombospondin type 1 motif, 2'}

Άσκηση 70

Έστω το παρακάτω string:

a = '''
SQMHE criteria provided, conflicting interpretations
IVD1E criteria provided, multiple submitters, no conflicts
ET6J1 practice guideline
Y9FG3 criteria provided, conflicting interpretations
KP60Q practice guideline
0E9QJ practice guideline
AQF3W reviewed by expert panel
NMI9P criteria provided, conflicting interpretations
FU050 criteria provided, multiple submitters, no conflicts
VEI07 criteria provided, multiple submitters, no conflicts
XFQBP practice guideline
Y60AJ reviewed by expert panel
4R1U0 criteria provided, multiple submitters, no conflicts
9PWZY practice guideline
PTFEV practice guideline
9Z3FC criteria provided, conflicting interpretations
TOPVK reviewed by expert panel
OHI5Y practice guideline
GY4BS criteria provided, multiple submitters, no conflicts
UFZDH reviewed by expert panel
'''

Η πρώτη λέξη του string περιέχει ένα τυχαίο όνομα γονιδίου. Οι υπόλοιπες περιέχουν μία τιμή που ονομάζουμε clinical significance. H τιμή αυτή παίρνει μία από τις ακόλουθες 4 τιμές: 'practice guideline', 'reviewed by expert panel', 'criteria provided, multiple submitters, no conflicts', 'criteria provided, conflicting interpretations'].

Γράψτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένα string με δομή όπως το a. Η συνάρτηση θα επιστρέφει μία λίστα με τις 2 πιο κοινές τιμές του clinical significance που εμφανίζονται στο a.

Για παράδειγμα θα πρέπει:

print (f(a)) 
#Τυπώνει
['practice guideline', 'criteria provided, multiple submitters, no conflicts']

Άσκηση 71

Μία μετάλλαξη σε ένα αμινοξύ μίας πρωτεΐνης περγράφεται σύμφωνα με την ονοματολογία HGVS με αυτόν τον τρόπο:

  • Τρία γράμματο τα οποία είναι το αμινοξύ αναφοράς
  • Ένας αριθμός το οποίο είναι η θέση πάνω στη πρωτεΐνη
  • Τρία γράμματα τα οποία είναι το μεταλλαγμένο αμινοξύ.

Για παράδειγμα η μετάλλαξη Trp24Cys σημαίνει ότι στη θέση 24 της πρωτεΐνης το αμινοξύ Tryptophan (Trp) έγινε Cysteine (Cys).

Λίστα με όλα τα αμινοξέα (σε τρία γράμματα) είναι η εξής:

l = ['Ala', 'Arg', 'Asn', 'Asp', 'Cys', 'Glu', 'Gln', 'Gly', 'His', 'Ile', 'Leu', 'Lys', 'Met', 'Phe', 'Pro', 'Ser', 'Thr', 'Trp', 'Tyr', 'Val']

Φτιάξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένα string με τη HGVS αναπαράστασης μία πρωτεϊνικής μετάλλαξης. Η συνάρτηση θα επιστρέφει True αν η αναπαράσταση είναι σωστή και False διαφορετικά. Για να είναι σωστή θα πρέπει εκτός από το να είναι στο σωστό φορμάτ, θα πρέπει και τα δύο αμινοξέα (αναφοράς και μετάλλαξης) να ανήκουν στη λίστα l. Για παράδειγμα:

f('Trp24Cys') # Επιστρέφει True
f('Trp2A4Cys') # Επιστρέφει False
f('Tra2A4Cys') # Επιστρέφει False

Άσκηση 72

Σύμφωνα με την ονοματολογία Enzyme Commission number ένα ένζυμο μπορεί να περιγραφεί με τους εξής 4 διαφορετικούς τρόπους:

  1. EC+ κενο + ένας αριθμός. Για παράδειγμα: EC 3
  2. EC+ κενο + ένας αριθμός + μία τελεία + ένας αριθμός. Για παράδειγμα: EC 3.4
  3. EC+ κενο + ένας αριθμός + μία τελεία + ένας αριθμός + μία τελεία + ένας αριθμός. Για παράδειγμα: EC 3.4.11
  4. EC+ κενο + ένας αριθμός + μία τελεία + ένας αριθμός + μία τελεία + ένας αριθμός + μία τελεία + ένας αριθμός. Για παράδειγμα: EC 3.4.11.4

Αλλάξτε τη παρακάτω συνάρτηση:

def f(x):
  m = re.fullmatch(r'XYZ',x)
  return bool(m)

αλλάζοντας μόνο το regular expression (XYZ), έτσι ώστε η συνάρτηση να επιστρέφει True ή False ανάλογα με το αν ένα ένζυμο έχει σωστό Enzyme Commission number ή όχι. Για παράδειγμα θα πρέπει:

f('EC 3') # επιστρέφει True
f('EC 3.4') # επιστρέφει True
f('EC 3.4.11') # επιστρέφει True
f('EC 3.4.11.7') # επιστρέφει True
f('EC 3.4.11.7.3') # επιστρέφει False

Άσκηση 73

Στις ΗΠΑ, συνηθίζεται να τυπώνεται μία ημερομηνία με το εξής φορμάτ: mm-dd-yyyy. Όπου mm είναι τα δύο ψηφία που αναπαριστούν τον μήνα, dd είναι τα δύο ψηφία που αναπαριστούν τη μέρα και yyyy είναι τα τέσσερα ψηφία που αναπαριστούν τον χρόνο. Για παράδειγμα σήμερα σύμφωνα με αυτή την αναπαράσταση η ημερομηνία είναι: 05-24-2021. Γράψτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένα string το οποίο θα αναπαριστάει μία ημερομηνία με βάση το αμερικανικό σύστημα. Η συνάρτηση θα επιστρέφει την ημερομηνία με βάση το φορμάτ: yyyy-mm-dd. Για παράδειγμα θα πρέπει:

f('05-24-2021') # Επιστρέφει: '2021-05-24'

Η συνάρτηση είναι υποχρεωτικό να χρησιμοποιεί τη συνάρτηση re.sub, δηλαδή να έχει τη μορφή:

import re

def f(x):
  return re.sub(r'ABC', r'XYZ', x)

Όπου θα έχετε βάλει τις κατάλληλες τιμές αντί για ABC και XYZ.

Άσκηση 74

H UniProtKB είναι μία βάση δεδομένων σχετικά με πρωτεΐνες. Κάθε καταχώριση στη UniProtKB μπορεί να έχει ένα από τα παρακάτω 3 φορμάτ [δείτε εδώ για περισσότερα]:

  • P00750: UniProtKB entry. Δηλαδή το γράμματα P ακολουθούμενο από μερικά μηδενικά, και από έναν αριθμό.
  • P00750-2: UniProtKB entry isoform sequence. Δηλαδή το γράμματα P ακολουθούμενο από μερικά μηδενικά, από έναν αριθμό μία παύλα και έναν αριθμό.
  • P00750[39-81]: UniProtKB sequence range. Δηλαδή το γράμματα P ακολουθούμενο από μερικά μηδενικά, έναν αριθμό, το χαρακτήρα [, έναν αριθμό, τον χαρακτήρα -, έναν αριθμό και τον χαρακτήρα ].

Γράψτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο ένα string το οποίο θα αναπαριστάει μία καταχώριση στη UniProtKB. H συνάρτηση θα επιστρέφει:

  • True αν η καταχώριση είναι μία από τις 3 αποδεκτές μορφές που παρουσιάστηκαν παραπάνω.
  • False Διαφορετικά.

Για παράδειγμα:

f('P00750') # Επιστρέφει True
f('P00750-2') # Επιστρέφει True
f('P00750[39-81]') # Επιστρέφει True
f('P750') # Επιστρέφει False
f('P00750+2') # Επιστρέφει Fals
f('P00750[-81]') # Επιστρέφει False

Αυτή την άσκηση:

  • Αν την υλοποιήσετε με 1 μόνο regular expression θα βαθμολογηθείτε με άριστα το 10
  • Αν την υλοποιήσετε με παραπάνω από 1 regular expression θα βαθμολογηθείτε με άριστα το 9
  • Αν την υλοποιήσετε χωρίς regular expression θα βαθμολογηθείτε με άριστα το 8

Άσκηση 75

Γράψτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένα string το οποία θα αναπαριστάει μία ακολουθία DNA η οποία θα περιέχει πολλά start codon (ATG) και πολλά end codon (TAA ή TAG ή TGA). H συνάρτηση θα επιστρέφει τη μικρότερη δυνατή υπο-ακολουθία της παραμέτρου η οποία να αρχίζει απο ATG και να τελειώνει σε ένα από τα stop codons. Για παράδειγμα έστω η ακολουθία:

AAAATGTTTCCCATGTTTTAAGGGTGAGGG
   ^^^      ^^^   ^^^   ^^^
    |        |     |     |
  start    start  end   end
  codon    codon  codon codon

Η μικρότερη δυνατή υπο-ακολουθία η οποία να ξεκινάει από start codon και να τελειώνει σε end codon είναι η ATGTTTTAA:

            ATGTTTTAA
             |     |
            vvv   vvv
AAAATGTTTCCCATGTTTTAAGGGTGAGGG
   ^^^      ^^^   ^^^   ^^^
    |        |     |      |
  start    start  end    end
  codon    codon  codon  codon

Θα πρέπει οπότε:

f('AAAATGTTTCCCATGTTTTAAGGGTAAGGG') # Επιστρέφει: 'ATGTTTTAA'

Σημείωση:

  • Δεν χρειάζεται να θεωρείσετε ότι το μήκος της υπο-ακολουθίας είναι πολλαπλάσιο του 3 (δεν είναι λάθος φυσικά αν το κάνετε)

Άσκηση 76

Γράψτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένα string το οποίο περιέχει έναν ακέραιο αριθμό. Η συνάρτηση θα επιστρέφει:

  • True: Αν το string δεν περιέχει δύο διαδοχικά γράμματα τα οποία να είναι και τα δύο μονά ή και τα δύο ζυγά
  • False: Αν δεν ισχύει το παραπάνω

Για παράδειγμα:

f('1') # Επιστρέφει True
f('12') # Επιστρέφει True
f('13') # Επιστρέφει False (Τα 1 και 3 είναι διαδοχικά και είναι και τα 2 μονά) 
f('01') # Επιστρέφει True 
f('02') # Επιστρέφει False (Τα 0 και 2 είναι διαδοχικά και είναι και τα 2 ζυγά) 
f('123') # Επιστρέφει True
f('125') # Επιστρέφει True
f('124') # Επιστρέφει False
f('01234567890') # Επιστρέφει True
f('121212121212') # Επιστρέφει True
f('141618') # Επιστρέφει True
f('141628') # Επιστρέφει False (Τα 6,2 είναι συνεχόμενα και ζυγά)

Αυτή την άσκηση:

  • Αν την υλοποιήσετε με 1 μόνο regular expression (π.χ. με re.fullmatch(r'XYZ'), ή με οποιαδήποτε άλλη συνάρτηση της βιβλιοθήκης re) θα βαθμολογηθείτε με άριστα το 10.
  • Οποιαδήποτε άλλη υλοποίηση θα βαθμολογηθεί με άριστα το 9.

Άσκηση 77

Φτιάξτε μία συνάρτηση η οποία δεν θα παίρνει καμία παράμετρο. Η συνάρτηση πρέπει να επιστρέφει μία λίστα με όλους τους δυνατούς τρόπους που μπορούμε να αθροίσουμε διαφορετικούς ακέραιους από το 1 μέχρι και το 10, έτσι ώστε το άθροισμά τους να μην είναι μεγαλύτερο από το 15.

Ένας άλλος τρόπος να το εκφράσουμε αυτό είναι. Φτιάξτε μία λίστα η οποία θα περιέχει όλες τις δυνατές υπολίστες με αριθμούς τέτοιους ώστε:

  • Όλοι οι αριθμοί να είναι ακέραιοι μεγαλύτεροι από το 0 και μικρότεροι ή ίσοι με το 10
  • Όλοι οι αριθμοί να είναι διαφορετικοί μεταξύ τους.
  • Τα άθροισμά τους να είναι μικρότερο ή ίσο με το 15.
  • Κάθε υπολίστα να είναι μοναδική. Δηλαδή δεν μπορούν 2 υπολίστες να έχουν ακριβώς τους ίδιους αριθμούς.

Για παράδειγμα θα πρέπει:

s = f()
print ([3, 10] in s) # Τυπώνει True αφού 3+10 <= 15
print ([3, 4, 10] in s) # Τυπώνει False αφού 3+4+10 > 15

Δίνεται ότι:

print (len(s)) # Τυπώνει: 119

Άσκηση 78

Στο παιχνίδι ΤΖΟΚΕΡ, ένας παίκτης πρέπει να επιλέξει 5 από 45 αριθμούς (αυτούς του 5 τους ονομάζουμε και αρχικούς) και έναν αριθμό από 20 αριθμούς (τον ονομάζουμε Τζόκερ). Το πλήθος από διαφορετικές στήλες που μπορεί να παίξει κάποιος στο ΤΖΟΚΕΡ είναι 24.435.180. Μία στήλη στο ΤΖΟΚΕΡ αποτελείται από 6 αριθμούς. Οι πρώτοι 5 αριθμοί είναι ένας συνδυασμός από 5 αριθμούς ανάμεσα σε 45 αριθμούς (από το 1 μέχρι και το 45). Ο τελευταίος αριθμός είναι ένας αριθμός ανάμεσα σε 20 αριθμούς (από το 1 μέχρι και το 20). Για παράδειγμα μία στήλη στο Τζόκερ είναι:

[5, 10, 15, 20, 35, 45, 15]
 ^  ^^  ^^  ^^  ^^  ^^      --> 5 διαφορετικοί αριθμοί τυχαία επιλεγμένοι από το 1 μέχρι και το 45
                        ^^  --> 1 αριθμός τυχαία επιλεγμένος από το 1 μέχρι και το 20 (Τζόκερ)

Κάποιος.. insider, σας ενημερώνει ότι στην επόμενη κλήρωση ο αριθμός του Τζοκερ (δηλαδή ο τελευταίος της στήλης) θα είναι ένας από τους 5 αρχικούς αριθμούς. Πόσες είναι οι δυνατές στήλες τώρα;

Γράψτε μία συνάρτηση η οποία δεν θα παίρνει καμία παράμετρο. Η συνάρτηση θα επιστρέφει την απάντηση στο παραπάνω ερώτημα.

Δίνεται ότι:

print (f())
# Τυπώνει: 2715020   

Άσκηση 79

Σύμφωνα με την εικασία του Golbach, για κάθε θετικό άρτιο (ζυγό) αριθμό μεγαλύτερο του 2, υπάρχει τουλάχιστον ένα ζευγάρι πρώτων αριθμών των οποίων το άθροισμα να είναι αυτός ο αριθμός. Η εικασία αυτή δεν έχει αποδειχθεί αλλά έχει επιβεβαιώθεί για ένα τεράστιο πλήθος από αριθμούς.

Γράψτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένας θετικός άρτιος ακέραιος αριθμός μεγαλύτερος από το 2 και μικρότερος ή ίσος από το 1000 (δεν χρειάζεται να το ελέγξετε αυτό). Η συνάρτηση θα επιστρέφει ένα tuple το οποίο θα περιέχει 2 ακέραιους πρώτους αριθμούς των οποίων το άθροισμα θα είναι ο αριθμός της παραμέτρου.

Για να το υλοποιήσετε αυτό μπορείτε απλά να ψάξετε για όλα τα πιθανά ζευγάρια πρώτων, των οποίων το άθροισμα να είναι η τιμή της παραμέτρου.

Άσκηση 80

Δίνεται το παρακάτω string:

a = '''{"YNVY": [[1201, 1681], [2032, 2740]], "FRNE": [[1343, 1624], [2186, 2848], [3250, 3604], [4348, 4842]], "LHZO": [[1020, 1848], [2498, 2884], [3249, 3574]], "OWWN": [[1011, 1892], [2426, 2775], [3239, 3867], [4415, 4895]], "GRFW": [[1129, 1583], [2146, 2548]], "AKAU": [[1149, 1766], [2399, 2895], [3280, 3561], [4099, 4965], [5149, 5696]], "KVHH": [[1317, 1749], [2458, 2946], [3061, 3651], [4192, 4735], [5187, 5749], [6305, 6644]], "PKAB": [[1230, 1834], [2364, 2539], [3116, 3650]], "ZALE": [[1450, 1570], [2323, 2884], [3257, 3940], [4169, 4963]], "LKJY": [[1351, 1604], [2461, 2947], [3204, 3887], [4037, 4945], [5115, 5978], [6422, 6624], [7154, 7957], [8153, 8893]], "NZKA": [[1450, 1803], [2361, 2585], [3050, 3749], [4208, 4986], [5315, 5740], [6192, 6704], [7265, 7971], [8012, 8653], [9480, 9959]], "BBGG": [[1175, 1603], [2451, 2573]], "DCER": [[1107, 1786], [2174, 2553], [3372, 3608], [4323, 4527], [5081, 5580]], "YXLS": [[1043, 1751], [2143, 2868], [3115, 3611]], "ITAT": [[1121, 1885]], "EYYT": [[1267, 1725], [2119, 2745], [3085, 3902], [4135, 4929], [5265, 5709], [6360, 6897], [7477, 7502], [8334, 8949], [9434, 9517]], "OXTB": [[1035, 1859], [2247, 2643], [3367, 3827], [4111, 4513], [5216, 5554], [6443, 6952], [7406, 7650]], "GKHK": [[1004, 1615], [2478, 2892], [3298, 3903], [4379, 4810]], "EBRP": [[1077, 1948], [2497, 2833], [3317, 3579], [4371, 4863], [5354, 5694], [6391, 6718], [7100, 7809], [8308, 8939]], "HKDI": [[1205, 1966], [2164, 2982], [3393, 3749], [4222, 4816], [5109, 5593], [6072, 6649]]}'''

Το string αυτό περιέχει ένα dictionary σε μορφή json. Το dictionary αυτό περιέχει τις θέσεις πάνω σε ένα χρωμόσωμα όπου αντιστοιχούν η αρχή και το τέλος των εξωνίων από 20 γονίδια (όλα τα δεδομένα είναι τυχαία). Όπως παρατηρούμε κάθε γονίδιο μπορεί να έχει διαφορετικό πλήθος από εξόνια.

Φτιάξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένα string όπως το a. Η συνάρτηση θα επιστρέφει το όνομα του γονιδίου το οποίο έχει το μεγαλύτερο σε μήκος εξόνιο. Το μήκος ενός εξονίου είναι η διαφορά του τέλους με την αρχή του. Η συνάρτηση δηλάδή θα επιστρέφει ένα string.

Άσκηση 81,82,82,83,84,85

Για αυτές τις ασκήσεις χρειάζεται η παρακάτω συνάρτηση:

import pandas as pd
import json

def load_cities():
  s = '''{"Rank": {"0": 1, "1": 2, "2": 3, "3": 4, "4": 5, "5": 6, "6": 7, "7": 8, "8": 9, "9": 10, "10": 11, "11": 12, "12": 13, "13": 14, "14": 15, "15": 16, "16": 17, "17": 18, "18": 19, "19": 20, "20": 21, "21": 22, "22": 23, "23": 24, "24": 25, "25": 26, "26": 27, "27": 28, "28": 29, "29": 30, "30": 31, "31": 32, "32": 33, "33": 34, "34": 35, "35": 36, "36": 37, "37": 38, "38": 39, "39": 40, "40": 41, "41": 42, "42": 43, "43": 44, "44": 45, "45": 46, "46": 47, "47": 48, "48": 49, "49": 50, "50": 51, "51": 52, "52": 53, "53": 54, "54": 55, "55": 56, "56": 57, "57": 58, "58": 59, "59": 60, "60": 61, "61": 62, "62": 63, "63": 64, "64": 65, "65": 66, "66": 67, "67": 68, "68": 69, "69": 70, "70": 71, "71": 72, "72": 73, "73": 74, "74": 75, "75": 76, "76": 77, "77": 78, "78": 79, "79": 80, "80": 81, "81": 82, "82": 83, "83": 84, "84": 85, "85": 86, "86": 87, "87": 88, "88": 89, "89": 90, "90": 91, "91": 92, "92": 93, "93": 94, "94": 95, "95": 96, "96": 97, "97": 98, "98": 99, "99": 100, "100": 101, "101": 102, "102": 103, "103": 104, "104": 105, "105": 106, "106": 107, "107": 108, "108": 109, "109": 110, "110": 111, "111": 112, "112": 113, "113": 114, "114": 115, "115": 116, "116": 117, "117": 118, "118": 119, "119": 120, "120": 121, "121": 122, "122": 123, "123": 124, "124": 125, "125": 126, "126": 127, "127": 128, "128": 129, "129": 130, "130": 131, "131": 132, "132": 133, "133": 134, "134": 135, "135": 136, "136": 137, "137": 138, "138": 139, "139": 140, "140": 141, "141": 142, "142": 143, "143": 144}, "City": {"0": "Athens", "1": "Thessaloniki", "2": "Patras", "3": "Piraeus", "4": "Larissa", "5": "Heraklion", "6": "Peristeri", "7": "Kallithea", "8": "Acharnes", "9": "Kalamaria", "10": "Nikaia", "11": "Glyfada", "12": "Volos", "13": "Ilio", "14": "Ilioupoli", "15": "Keratsini", "16": "Evosmos", "17": "Chalandri", "18": "Nea Smyrni", "19": "Marousi", "20": "Agios Dimitrios", "21": "Zografou", "22": "Egaleo", "23": "Nea Ionia", "24": "Ioannina", "25": "Palaio Faliro", "26": "Korydallos", "27": "Trikala", "28": "Vyronas", "29": "Agia Paraskevi", "30": "Galatsi", "31": "Agrinio", "32": "Chalcis", "33": "Petroupoli", "34": "Serres", "35": "Alexandroupoli", "36": "Xanthi", "37": "Katerini", "38": "Kalamata", "39": "Kavala", "40": "Chania", "41": "Lamia", "42": "Komotini", "43": "Irakleio", "44": "Rhodes", "45": "Kifissia", "46": "Stavroupoli", "47": "Chaidari", "48": "Drama", "49": "Veria", "50": "Alimos", "51": "Kozani", "52": "Polichni", "53": "Karditsa", "54": "Sykies", "55": "Ampelokipoi", "56": "Pylaia", "57": "Agioi Anargyroi", "58": "Argyroupoli", "59": "Ano Liosia", "60": "Nea Ionia", "61": "Rethymno", "62": "Ptolemaida", "63": "Tripoli", "64": "Cholargos", "65": "Vrilissia", "66": "Aspropyrgos", "67": "Corinth", "68": "Gerakas", "69": "Metamorfosi", "70": "Giannitsa", "71": "Voula", "72": "Kamatero", "73": "Mytilene", "74": "Neapoli", "75": "Eleftherio-Kordelio", "76": "Chios", "77": "Agia Varvara", "78": "Kaisariani", "79": "Nea Filadelfeia", "80": "Moschato", "81": "Perama", "82": "Salamina", "83": "Eleusis", "84": "Corfu", "85": "Pyrgos", "86": "Megara", "87": "Kilkis", "88": "Dafni", "89": "Thebes", "90": "Melissia", "91": "Argos", "92": "Arta", "93": "Artemida", "94": "Livadeia", "95": "Pefki", "96": "Oraiokastro", "97": "Aigio", "98": "Kos", "99": "Koropi", "100": "Preveza", "101": "Naousa", "102": "Orestiada", "103": "Peraia", "104": "Edessa", "105": "Florina", "106": "Panorama", "107": "Nea Erythraia", "108": "Elliniko", "109": "Amaliada", "110": "Pallini", "111": "Sparta", "112": "Agios Ioannis Rentis", "113": "Thermi", "114": "Vari", "115": "Nea Makri", "116": "Tavros", "117": "Alexandreia", "118": "Menemeni", "119": "Paiania", "120": "Kalyvia Thorikou", "121": "Nafplio", "122": "Drapetsona", "123": "Efkarpia", "124": "Papagou", "125": "Nafpaktos", "126": "Kastoria", "127": "Grevena", "128": "Pefka", "129": "Nea Alikarnassos", "130": "Missolonghi", "131": "Gazi", "132": "Ierapetra", "133": "Kalymnos", "134": "Rafina", "135": "Loutraki", "136": "Agios Nikolaos", "137": "Ermoupoli", "138": "Ialysos", "139": "Mandra", "140": "Tyrnavos", "141": "Glyka Nera", "142": "Ymittos", "143": "Neo Psychiko"}, "Census 1991": {"0": 772072, "1": 383967, "2": 152570, "3": 182671, "4": 112777, "5": 115270, "6": 137288, "7": 194233, "8": 61052, "9": 80698, "10": 87597, "11": 63306, "12": 77192, "13": 78326, "14": 75037, "15": 71982, "16": 28821, "17": 66285, "18": 69749, "19": 64092, "20": 57574, "21": 80492, "22": 78563, "23": 60635, "24": 56699, "25": 61371, "26": 63184, "27": 45835, "28": 58523, "29": 47463, "30": 57230, "31": 52081, "32": 51646, "33": 38278, "34": 50017, "35": 37904, "36": 37430, "37": 43613, "38": 43625, "39": 56571, "40": 50077, "41": 44084, "42": 37036, "43": 42905, "44": 42400, "45": 39166, "46": 37596, "47": 44831, "48": 37604, "49": 37858, "50": 32024, "51": 31553, "52": 27894, "53": 30067, "54": 34059, "55": 40093, "56": 20785, "57": 30739, "58": 31530, "59": 21397, "60": 27904, "61": 23420, "62": 25125, "63": 22429, "64": 33691, "65": 16571, "66": 15715, "67": 27412, "68": 8512, "69": 21052, "70": 22504, "71": 17998, "72": 17410, "73": 23971, "74": 30568, "75": 16549, "76": 22894, "77": 28706, "78": 26701, "79": 25261, "80": 22039, "81": 24119, "82": 22567, "83": 22793, "84": 31359, "85": 28465, "86": 20403, "87": 12139, "88": 24152, "89": 19505, "90": 13469, "91": 21901, "92": 19087, "93": 9485, "94": 18437, "95": 17987, "96": 5458, "97": 22178, "98": 14714, "99": 12790, "100": 13695, "101": 19794, "102": 12691, "103": 2949, "104": 17128, "105": 12355, "106": 10275, "107": 12993, "108": 13517, "109": 15232, "110": 8021, "111": 13011, "112": 14218, "113": 5156, "114": 8488, "115": 12120, "116": 15456, "117": 12109, "118": 12932, "119": 9710, "120": 8488, "121": 11897, "122": 13094, "123": 3480, "124": 13974, "125": 10854, "126": 14775, "127": 9345, "128": 3561, "129": 10683, "130": 10916, "131": 1395, "132": 9541, "133": 10543, "134": 7752, "135": 9388, "136": 8093, "137": 13030, "138": 7193, "139": 10012, "140": 12028, "141": 5813, "142": 11671, "143": 12023}, "Census 2001": {"0": 745514, "1": 363987, "2": 160400, "3": 175697, "4": 124394, "5": 130914, "6": 137918, "7": 109609, "8": 75329, "9": 87255, "10": 93086, "11": 80409, "12": 82439, "13": 80859, "14": 75904, "15": 76102, "16": 52624, "17": 71684, "18": 73986, "19": 69470, "20": 65173, "21": 76115, "22": 74046, "23": 66017, "24": 61629, "25": 64759, "26": 67456, "27": 48686, "28": 61102, "29": 56836, "30": 58042, "31": 54523, "32": 53584, "33": 48327, "34": 54266, "35": 48885, "36": 45111, "37": 50510, "38": 49154, "39": 58663, "40": 53373, "41": 46406, "42": 43326, "43": 45926, "44": 52318, "45": 43929, "46": 41653, "47": 45227, "48": 42501, "49": 42794, "50": 38047, "51": 35242, "52": 36146, "53": 32031, "54": 41726, "55": 40959, "56": 22744, "57": 32957, "58": 33158, "59": 26423, "60": 30804, "61": 27868, "62": 28679, "63": 25520, "64": 32166, "65": 25582, "66": 27741, "67": 29787, "68": 13921, "69": 26448, "70": 26296, "71": 25532, "72": 22234, "73": 27247, "74": 29995, "75": 21630, "76": 23779, "77": 30562, "78": 26323, "79": 24112, "80": 23153, "81": 25720, "82": 25730, "83": 25863, "84": 28185, "85": 23274, "86": 23032, "87": 17430, "88": 23674, "89": 21211, "90": 19526, "91": 24239, "92": 19435, "93": 17391, "94": 20061, "95": 19887, "96": 11896, "97": 21061, "98": 17890, "99": 15860, "100": 16321, "101": 19870, "102": 15246, "103": 13306, "104": 18253, "105": 14279, "106": 14552, "107": 15439, "108": 16740, "109": 18261, "110": 12552, "111": 14817, "112": 15060, "113": 11360, "114": 10998, "115": 13986, "116": 14963, "117": 13229, "118": 14910, "119": 12855, "120": 12202, "121": 13822, "122": 12944, "123": 6598, "124": 13207, "125": 12924, "126": 14813, "127": 10177, "128": 6434, "129": 11551, "130": 12225, "131": 8018, "132": 11678, "133": 10149, "134": 11352, "135": 11383, "136": 10080, "137": 11799, "138": 10107, "139": 10947, "140": 11116, "141": 6623, "142": 11139, "143": 10848}, "Census 2011": {"0": 664046, "1": 315196, "2": 167446, "3": 163688, "4": 144651, "5": 140730, "6": 139981, "7": 100641, "8": 99346, "9": 91279, "10": 89380, "11": 87305, "12": 86046, "13": 84793, "14": 78153, "15": 77077, "16": 74686, "17": 74192, "18": 73076, "19": 72333, "20": 71294, "21": 71026, "22": 69946, "23": 67134, "24": 65574, "25": 64021, "26": 63445, "27": 61653, "28": 61308, "29": 59704, "30": 59345, "31": 59329, "32": 59125, "33": 58979, "34": 58287, "35": 57812, "36": 56122, "37": 55997, "38": 54100, "39": 54027, "40": 53910, "41": 52006, "42": 50990, "43": 49642, "44": 49541, "45": 47332, "46": 46008, "47": 45642, "48": 44823, "49": 43158, "50": 41720, "51": 41066, "52": 39332, "53": 38554, "54": 37753, "55": 37381, "56": 34625, "57": 34168, "58": 34097, "59": 33565, "60": 32661, "61": 32468, "62": 32127, "63": 30866, "64": 30840, "65": 30741, "66": 30251, "67": 30176, "68": 29939, "69": 29891, "70": 29789, "71": 28364, "72": 28361, "73": 27871, "74": 27084, "75": 27067, "76": 26850, "77": 26550, "78": 26370, "79": 25734, "80": 25441, "81": 25389, "82": 25370, "83": 24910, "84": 24838, "85": 24359, "86": 23456, "87": 22914, "88": 22913, "89": 22883, "90": 22741, "91": 22209, "92": 21895, "93": 21488, "94": 21379, "95": 21352, "96": 20852, "97": 20422, "98": 19432, "99": 19164, "100": 19042, "101": 18882, "102": 18426, "103": 18326, "104": 18229, "105": 17686, "106": 17444, "107": 17379, "108": 17259, "109": 16763, "110": 16415, "111": 16239, "112": 16050, "113": 16004, "114": 15855, "115": 15554, "116": 14972, "117": 14821, "118": 14746, "119": 14595, "120": 14424, "121": 14203, "122": 13968, "123": 13905, "124": 13699, "125": 13415, "126": 13387, "127": 13137, "128": 13052, "129": 12925, "130": 12785, "131": 12606, "132": 12355, "133": 12324, "134": 12168, "135": 11564, "136": 11421, "137": 11407, "138": 11331, "139": 11327, "140": 11069, "141": 11049, "142": 10715, "143": 10137}, "Region": {"0": "Attica", "1": "Central Macedonia", "2": "Western Greece", "3": "Attica", "4": "Thessaly", "5": "Crete", "6": "Attica", "7": "Attica", "8": "Attica", "9": "Central Macedonia", "10": "Attica", "11": "Attica", "12": "Thessaly", "13": "Attica", "14": "Attica", "15": "Attica", "16": "Central Macedonia", "17": "Attica", "18": "Attica", "19": "Attica", "20": "Attica", "21": "Attica", "22": "Attica", "23": "Attica", "24": "Epirus", "25": "Attica", "26": "Attica", "27": "Thessaly", "28": "Attica", "29": "Attica", "30": "Attica", "31": "Western Greece", "32": "Central Greece", "33": "Attica", "34": "Central Macedonia", "35": "Eastern Macedonia and Thrace", "36": "Eastern Macedonia and Thrace", "37": "Central Macedonia", "38": "Peloponnese", "39": "Eastern Macedonia and Thrace", "40": "Crete", "41": "Central Greece", "42": "Eastern Macedonia and Thrace", "43": "Attica", "44": "South Aegean", "45": "Attica", "46": "Central Macedonia", "47": "Attica", "48": "Eastern Macedonia and Thrace", "49": "Central Macedonia", "50": "Attica", "51": "Western Macedonia", "52": "Central Macedonia", "53": "Thessaly", "54": "Central Macedonia", "55": "Central Macedonia", "56": "Central Macedonia", "57": "Attica", "58": "Attica", "59": "Attica", "60": "Thessaly", "61": "Crete", "62": "Western Macedonia", "63": "Peloponnese", "64": "Attica", "65": "Attica", "66": "Attica", "67": "Peloponnese", "68": "Attica", "69": "Attica", "70": "Central Macedonia", "71": "Attica", "72": "Attica", "73": "North Aegean", "74": "Central Macedonia", "75": "Central Macedonia", "76": "North Aegean", "77": "Attica", "78": "Attica", "79": "Attica", "80": "Attica", "81": "Attica", "82": "Attica", "83": "Attica", "84": "Ionian Islands", "85": "Western Greece", "86": "Attica", "87": "Central Macedonia", "88": "Attica", "89": "Central Greece", "90": "Attica", "91": "Peloponnese", "92": "Epirus", "93": "Attica", "94": "Central Greece", "95": "Attica", "96": "Central Macedonia", "97": "Western Greece", "98": "South Aegean", "99": "Attica", "100": "Epirus", "101": "Central Macedonia", "102": "Eastern Macedonia and Thrace", "103": "Central Macedonia", "104": "Central Macedonia", "105": "Western Macedonia", "106": "Central Macedonia", "107": "Attica", "108": "Attica", "109": "Western Greece", "110": "Attica", "111": "Peloponnese", "112": "Attica", "113": "Central Macedonia", "114": "Attica", "115": "Attica", "116": "Attica", "117": "Central Macedonia", "118": "Central Macedonia", "119": "Attica", "120": "Attica", "121": "Peloponnese", "122": "Attica", "123": "Central Macedonia", "124": "Attica", "125": "Western Greece", "126": "Western Macedonia", "127": "Western Macedonia", "128": "Central Macedonia", "129": "Crete", "130": "Western Greece", "131": "Crete", "132": "Crete", "133": "South Aegean", "134": "Attica", "135": "Peloponnese", "136": "Crete", "137": "South Aegean", "138": "South Aegean", "139": "Attica", "140": "Thessaly", "141": "Attica", "142": "Attica", "143": "Attica"}}'''

  return pd.DataFrame(json.loads(s))

Η συνάρτηση αυτή επιστρέφει ένα DataFrame με τον πληθυσμό των Ελληνικών πόλεων στις απογραφές που έγιναν το 1991, 2001 και 2011 (τα δεδομένα προέρχονται από τη wikipedia).

Άσκηση 81

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν όρισμα ένα DataFrame σαν αυτό που επιστρέφει η load_cities. H συνάρτηση θα επιστρέφει ένα νέο DataFrame (ή μία λίστα, ό,τι θέλετε) το οποίο θα περιέχει τη πόλη με τον μεγαλύτερο πληθυσμό για κάθε περιφέρεια της Ελλάδας σύμφωνα με την απογραφή του 2011.

Άσκηση 82

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν όρισμα ένα DataFrame σαν αυτό που επιστρέφει η load_cities. H συνάρτηση θα επιστρέφει ένα νέο DataFrame (ή μία λίστα, ό,τι θέλετε) η οποία θα περιέχει τις πόλεις που ο πληθυσμός τους μειώθηκε από το 2001 μέχρι το 2011.

Άσκηση 83

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν όρισμα ένα DataFrame σαν αυτό που επιστρέφει η load_cities. H συνάρτηση θα εμφανίζει ένα barplot με το άθροισμα του πληθυσμού της κάθε περιφέρειας (Region) με βάση την απογραφή του 2011, ταξινομημένο από τη περιφέρεια με τον μεγαλυτερο πληθυσμό προς τη περιφέρεια με τον μικρότερο. Η συνάρτηση δεν θα επιστρέφει τίποτα.

Το plot θα πρέπει να έχει τη παρακάτω μορφή:

img

Άσκηση 84

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν όρισμα ένα DataFrame σαν αυτό που επιστρέφει η load_cities. Η συνάρτηση θα εμφανίζει ένα scatter plot, όπου στον άξονα X θα είναι ο πληθυσμός των πολεων σύμφωνα με την απογραφή του 2001 και στον άξονα Υ σύμφωνα με την απογραφή του 2011. Το plot θα εμφανίζει μόνο πόλεις που ο πληθυσμός τους και στις δύο απογραφές ήταν κάτω από 200.000. Η συνάρτηση δεν θα επιστρέφει τίποτα.

Το plot θα πρέπει να έχει τη παρακάτω μορφή:

img

Άσκηση 85

Φτιαξτε μία συνάρτηση η οποία θα παίρνει σαν όρισμα ένα DataFrame σαν αυτό που επιστρέφει η load_cities. Η συνάρτηση θα εμφανίζει ένα barplot όπου για κάθε περιφέρεια (Region) θα εμφανίζονται δύο μπάρες. Μία για την απογραφή του 1991 και μία για την απογραφή του 2011. Κάθε μπάρα θα περιέχει το άθροισμα του πληθυσμού για όλες τις πόλεις της περιφέρειας για την κάθε χρονιά. Η συνάρτηση δεν θα επιστρέφει τίποτα.

Το plot θα πρέπει να έχει τη παρακάτω μορφή:

img

Άσκηση 86

Φτιάξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο, έστω a. Η παράμετρος αυτή θα είναι ένας 2-διάστατος numpy πίνακας. Η συνάρτηση θα επιστρέφει ένα μονοδιάστατο numpy πίνακα. Ο πίνακας αυτός θα περιέχει μόνο τα στοιχεία της περιμέτρου του a. Η σειρά με την οποία θα έχει τα νούμερα της περιμέτρου θα είναι είναι σαν να έχουμε "ξεδιπλώσει" η.. ξεφλουδίσει τον a ξεκινώντας από τη πρώτη γραμμή. Για παράδειγμα:

a = np.array([
  [6, 3, 4],
  [9, 3, 2],
  [6, 4, 3]]
)

f(a)
# Επιστρέφει:
array([ 6, 3, 4, 2, 3, 4, 6, 9 ])

b = np.array([
  [5, 4, 8, 7],
  [4, 5, 7, 3],
  [4, 4, 8, 5],
  [7, 2, 4, 2]
  ])

f(b)
# Επιστρέφει:
array([ 5, 4, 8, 7, 3, 5, 2, 4, 2, 7, 4, 4 ])

Επιπλέον επεξήγηση:

  [5, 4, 8, 7],
  [4, 5, 7, 3],
  [4, 4, 8, 5],
  [7, 2, 4, 2],

Παίρνουμε μόνο τη περίμετρο:

  [5, 4, 8, 7],
  [4,       3],
  [4,       5],
  [7, 2, 4, 2],


Ξεκινάμε από το πάνω αριστερά στοιχείο και κάνουμε κύκλο όλη τη περίμετρο.

      -->
      [5, 4, 8, 7],
                3],
                5],
[4, 4, 7, 2, 4, 2],

-->
[5, 4, 8, 7, 3, 5, 2, 4, 2, 7, 4, 4]

Άσκηση 87

Δίνεται ο παρακάτω μονοδιάστατος πίνακας με τα κρούσματα κοροναϊού στην Ελλάδα τις τελευταίες 451 μέρες:

import numpy as np
l = np.array([2, 1, 3, 0, 0, 0, 2, 22, 14, 21, 7, 11, 5, 10, 18, 73, 38, 103, 21, 35, 31, 46, 31, 35, 94, 71, 48, 78, 71, 74, 95, 95, 56, 102, 101, 129, 69, 60, 62, 20, 77, 52, 71, 56, 70, 33, 31, 25, 22, 15, 17, 11, 0, 10, 156, 7, 55, 27, 16, 11, 17, 32, 10, 15, 21, 8, 6, 6, 10, 21, 15, 13, 19, 6, 10, 18, 16, 10, 40, 9, 15, 2, 4, 10, 3, 21, 2, 2, 4, 10, 11, 3, 3, 6, 2, 1, 19, 0, 15, 15, 13, 17, 52, 9, 10, 20, 20, 4, 9, 13, 14, 55, 24, 10, 19, 10, 21, 15, 8, 11, 22, 23, 10, 14, 19, 23, 26, 28, 25, 8, 43, 27, 33, 50, 60, 40, 31, 23, 57, 27, 29, 25, 19, 24, 5, 36, 29, 33, 25, 31, 27, 34, 52, 57, 65, 76, 110, 75, 75, 118, 119, 145, 151, 151, 202, 126, 193, 235, 204, 251, 226, 217, 147, 250, 212, 250, 204, 243, 283, 155, 168, 293, 251, 269, 177, 157, 183, 207, 233, 241, 202, 186, 138, 139, 169, 248, 367, 287, 302, 204, 180, 310, 311, 359, 338, 240, 164, 453, 333, 358, 341, 286, 315, 216, 263, 416, 352, 411, 460, 267, 229, 300, 399, 406, 434, 391, 306, 280, 294, 408, 435, 452, 503, 482, 438, 432, 667, 865, 882, 841, 935, 790, 714, 1256, 1547, 1211, 1686, 2055, 1678, 1151, 2166, 2646, 2915, 2447, 2555, 1889, 1489, 2383, 2751, 3316, 3038, 2835, 1695, 2198, 2422, 3209, 3227, 2551, 2309, 1498, 1387, 2131, 2151, 2018, 1981, 1747, 1193, 1044, 2199, 2185, 1882, 1648, 1383, 903, 1250, 1324, 1675, 1533, 1395, 1194, 692, 639, 1199, 1185, 1153, 874, 901, 587, 525, 833, 935, 870, 617, 262, 342, 475, 1045, 942, 932, 597, 262, 390, 427, 927, 814, 510, 717, 799, 445, 441, 841, 668, 595, 577, 510, 237, 318, 537, 511, 506, 562, 605, 334, 432, 814, 857, 713, 882, 795, 484, 538, 1221, 1150, 1069, 1172, 1106, 733, 629, 1492, 1482, 1323, 1372, 1222, 662, 696, 1081, 754, 1400, 1435, 1424, 884, 870, 2111, 1903, 1783, 1732, 1630, 1269, 1170, 2312, 2697, 2217, 2181, 2301, 1142, 1161, 3181, 2629, 2570, 2357, 2503, 1626, 1134, 1508, 3458, 3070, 2762, 2532, 1514, 1705, 3517, 3058, 2587, 1466, 3132, 1441, 1724, 4322, 3612, 3483, 3058, 3229, 1955, 1863, 4293, 3445, 3215, 2734, 2799, 1717, 1606, 4017, 3081, 3822, 3027, 2411, 1829, 1606, 3750, 3010, 2756, 2739, 2596, 1399, 1307, 3287, 2770, 2415, 2125, 1389, 0, 2146, 1368, 2091, 3418, 2671, 2461, 1427, 1900, 3172, 2478, 2158, 2169, 1950, 1259, 1395, 2781, 2292, 1886, 1982, 1503])

Όταν παίρνουμε μία μέτρηση κάθε μέρα, οι μετρήσεις παρουσιάζουν διακυμάνσεις οι οποίες μπορούν να αλλοιώσουν τη γενικότερη εικόνα της πορείας των κρουσμάτων. Για παράδειγμα γνωρίζουμε ότι τα σαββατοκύριακα εντοπίζονται πολύ λιγότερα κρούσματα από ότι τις υπόλοιπες μέρες τις εβδομάδας. Για αυτό πολλές φορές εφαρμόζουμε μία διαδικασία η οποία ονομάζεται "εξομάλυνση" (smoothing). Η διαδικασία αυτή αντικαθιστά κάθε στοιχείο του πίνακα με τον μέσο όρο των γειτονικών του στοιχείων. Σαν γειτονικά στοιχεία εδώ θα θεωρήσουμε αυτό της προηγούμενη και της επόμενης μέρας. Το στοιχείο που βρίσκεται στην αρχή το αντικαθιστούμε με τον μέσο όρο αυτού και των 2 επόμενών του. Το στοιχείο που βρίσκεται στο τέλος το αντικαθιστούμε με τον μέσο όρο αυτού και των 2 προηγούμενων του. Αν πάτε στο worldometers για την Ελλάδα, στο γράφημα με την πορεία των κρουσμάτων (αλλά και των θανάτων) θα δείτε ότι σας δίνει την επιλογή να εμφανίσει το 3-day moving average το οποίο πρόκειται για την διαδικασία smoothing που μόλις περιγράψαμε.

Φτιάξτε λοιπόν μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένας πίνακα όπως ο l. Η συνάρτηση θα επιστρέφει έναν εξομαλυσμένο (smoothed) πίνακα, σύμφωνα με τη διαδικασία που περιγράφηκε παραπάνω.

Άσκηση 88

Φτιάξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένας ακέραιος θετικός αριθμός, έστω n. Η συνάρτηση θα "κατασκευάζει" και θα επιστρέφει έναν 2-διάστατο πίνακα σε numpy ως εξής:

Αν n==1 επιστρέφει τον πίνακα:

0

Αν n==2 επιστρέφει:

1 0 1
0 0 0
1 0 1

Αν n==3 επιστρέφει:

1 1 0 1 1
1 1 0 1 1
0 0 0 0 0
1 1 0 1 1
1 1 0 1 1

Αν n==4 επιστρέφει:

1 1 1 0 1 1 1
1 1 1 0 1 1 1
1 1 1 0 1 1 1
0 0 0 0 0 0 0
1 1 1 0 1 1 1
1 1 1 0 1 1 1
1 1 1 0 1 1 1

κτλ...

Σημείωση 1. Η συνάρτηση θα επιστρέφει numpy array. Όχι κάποιο string.

Σημείωση 2. Η συνάρτησή σας θα πρέπει να επιστρέφει τιμή για οποιοδήποτε θετικό αριθμό n

Άσκηση 89

Φτιάξτε μία συνάρτηση η οποία θα παίρνει σαν παράμετρο έναν διδιάστατο numpy πίνακα με θετικούς ακέραιους αριθμούς από το 1 μέχρι και το 10. Η συνάρτηση θα πρέπει να επιστρέφει έναν νέο πίνακα ίδιων διαστάσεων στον οποίο:

  • Οι τιμές από 1 μέχρι και 4 θα έχουν αντικατασταθεί με 5.
  • Οι τιμές από 5 μέχρι και 7 θα έχουν αντικατασταθεί με 8.
  • Οι τιμές από από 8 μέχρι και 10 θα έχουν αντικασταθεί με 10.

Για παράδειγμα θα πρέπει:

a = np.array([
  [5, 4, 8, 7],
  [4, 5, 7, 3],
  [4, 4, 8, 5],
  [7, 2, 4, 2]
  ])

f(a)
# Επιστρέφει:
array([
  [8, 5, 10, 8],
  [5, 8, 8, 5],
  [5, 5, 10, 8],
  [8, 5, 5, 5]
  ])

Σε αυτή την άσκηση (89) απογορεύεται να χρησιμοποιήσετε for/while

Άσκηση 90

Φτιάξτε μία συνάρτηση η οποία δεν παίρνει κανένα όρισμα. Η συνάρτηση θα υλοποιεί το εξής:

  1. Φτιάχνει έναν πίνακα με 100 ακέραιους τυχαίου αριθμούς από το 1 μέχρι και το 10, έστω a.
  2. Υπολογίζει τη συχνότητα του κάθε αριθμού από το 1 μέχρι το 10 στον πίνακα a.
  3. παράγει έναν τυχαίο αριθμό, έστω b από το 1 μέχρι και το 10 με πιθανότητα ίση με τη συχνότητά του στον πίνακα a. Για παράδειγμα αν η συχνότητα του 1 είναι 12% στον πίνακα a, τότε η πιθανότητα να παράξει το 1 πρέπει να είναι 12%. Κοιτάμε τη άσκηση 61 για να μας βοηθήσει να το κάνουμε αυτο. Μία άλλη εναλλακτική είναι να χρησιμοποιήσουμε τη παρακάτω μέθοδο:
# Παράγει έναν τυχαίο αριθμό από το 1 μέχρι και το 6. 
# Η πιθανότητα να παράξει το 1 είναι 10%
# Η πιθανότητα να παράξει το 2 είναι 5%
# ...
# Η πιθανότητα να παράξει το 6 είναι 20%
np.random.choice(np.arange(1, 7), p=[0.1, 0.05, 0.05, 0.2, 0.4, 0.2])
  1. Προσθέτει τον αριθμό b στον πίνακα a.
  2. Επαναλαμβάνει τα βήματα 2 μέχρι 4, 1000 φορές.
  3. Επιστρέφει τη συχνότητα του ποιο κοινού στοιχείου στον a.

Θα πρέπει:

f()
# επιστρέφει έναν αριθμό με τιμή από το 0.15 μέχρι το 0.20

Σημείωση: αυτό το πείραμα εφαρμόζεται πολύ στην οικολογία. Ένα είδος είναι χωρισμένο σε πολλές αγέλες (10 στη περίπτωση μας). Ένα νέο μέλος έρχεται και πρέπει να επιλέξει σε ποια αγέλη θα πάει. Η πιθανότητα να επιλέξει μία αγέλη είναι ανάλογη του μεγέθους της. Πολλά νέα μέλη προστίθονται και επιλέγουν αγέλη με αυτή τη λογική. Στο τέλος υπάρχει μία κυρίαρχη αγέλη που έχει πολύ περισσότερα μέλη από τις υπόλοιπες.

Άσκηση 91

Υπάρχουν αριθμοί που όλα τα ψηφία τους είναι συνεχόμενα. Π.χ: 1234, 5678. Υπάρχει όμως μόνο ένας πρώτος αριθμός μεγαλύτερος από το 999 και μικρότερος από το 10.000 που τα ψηφία του είναι συνεχόμενα. Ποιος είναι αυτός;

Γράψτε μία συνάρτηση η οποία δεν θα παίρνει κανένα όρισμα. Η συνάρτηση θα επιστρέφει την απάντηση σε αυτό το ερώτημα.

Άσκηση 92

Η μικρότερη δύναμη του 3 που περιέχει όλα τα ψηφία από το 0 μέχρι και το 9 είναι η 39:

339 = 4052555153018976267 (περιέχει όλα τα ψηφία από 0 μέχρι 9)

Ποια είναι η μικρότερη δύναμη του 2 που περιέχει όλα τα ψηφία από το 0 μέχρι το 9;

Γράψτε μία συνάρτηση η οποία δεν θα παίρνει κανένα όρισμα. Η συνάρτηση θα επιστρέφει την απάντηση σε αυτό το ερώτημα.

Άσκηση 93

Μία λίστα περιέχει τους βαθμούς των μαθητών μίας τάξης με τον εξής... άβολο τρόπο:

grades = ['Κώστας', 15, 12, 18, 'Δήμητρα', 9, 17, 'Ηρακλής', 11, 19, 8, 14]

Σε αυτή τη λίστα ο Κώστας έχει πάρει τους βαθμούς 15, 12, 18, Η Δήμητρα έχει πάρει τους βαθμούς 9, 17 και ο Ηρακλής έχει πάρει τους βαθμούς 11, 19, 8, 14.

Καταρχήν παρατηρούμε ότι κάθε μαθητής μπορεί να έχει διαφορετικό πλήθος από βαθμούς.

Φτιάξτε μία συνάρτηση η οποία θα δέχεται μία παράμετρο. Η παράμετρος θα είναι μία λίστα όπως η grades. H συνάρτηση θα επιστρέφει μία λίστα με τα ονόματα και τους μέσους όρους των μαθητών.

Για παράδειγμα:

result = f(grades)
print (result)
# Τυπώνει: ['Κώστας', 15.0 , 'Δήμητρα', 13.0 , 'Ηρακλής', 13.0 ] 

# Εξήγηση:
# (15+12+18)/3 = 15
# (9 + 17)/2 = 13
# (11 + 19 + 8 + 14)/4 = 13

Άσκηση 94

Στο παιχνίδι "φιδάκι" ένας παίκτης ξεκινάει από τη θέση 0 και ρίχνει ένα ζάρι. Στη συνέχεια προχωράει τόσες θέσεις όσο έδειξε το ζάρι σε ένα grid 10 Χ 10. Ο παίκτης ξεκινάει από τη θέση 0 με σκοπό να φτάσει ή να ξεπεράσει τη θέση 100. Σε κάποιες θέσεις υπάρχουν "φιδάκια" και σε κάποιες θέσεις "σκάλες". Αν ένας παίκτης πέσει σε φιδάκι τότε πάει σε χαμηλότερη θέση. Αν ένας παίκτης φτάσει σε σκάλα, τότε ανεβαίνει σε υψηλότερη θέση.

Παρακάτω δίνονται οι θέσεις που βρίσκονται και οι θέσεις που οδηγούν όλα τα φιδάκια:

snakes = (
    (41, 4), (44, 23), (49, 11), (58, 19), (52, 7), (62, 21), (69,31), (73, 1), (84, 13), (92,34), (95,26), (99, 21),
)

Για παράδειγμα αν ένας παίκτης πάει στο τετράγωνο 41 τότε θα μεταφερθεί στο τετράγωνο 4.

Παρακάτω δίνονται οι θέσεις που βρίσκονται και που φτάνουν όλες οι σκάλες:

ladders = ((28,36), (60, 84), (63, 85), (57, 75), (51, 91), (66, 88), (78, 82), (76, 94))

Για παράδειγμα αν κάποιος φτάσει στη θέση 28, τότε θα μεταφερθεί στη θέση 36

Προσέξτε τι συμβαίνει στη θέση 60!

Φτιάξτε μία συνάρτηση η οποία δεν θα παίρνει καμία παράμετρο. Η συνάρτηση επιστρέφει τον μέσο όρο από τον αριθμό ζαριών που πρέπει να ρίξει ένας παίκτης για να τελειώσει το παιχνίδι αν παίξει 10.000 φορές.

Άσκηση 95

Ένα πείραμα αλληλούχισης έκανε πολλά "διαβάσματα" (reads) ενός χρωμοσώματος το οποίο αποτελείται από 115 νουκλεοτίδια. Κάθε διάβασμα σε αυτό το πείραμα περιέχει ένα μικρό υποσύνολο της συνολικής ακολουθίας. Οι θέσεις τις οποίες ξεκινούν και τελειώνουν αυτά τα διαβάσματα είναι:

reads = [(44, 60), (83, 102), (30, 47), (56, 74), (37, 50), (73, 81), (81, 96), (85, 100), (73, 80), (61, 76), (48, 64), (81, 99), (65, 85), (48, 61), (64, 74), (39, 57), (41, 51), (60, 68), (55, 71), (35, 52), (90, 110), (1, 21), (46, 51), (56, 63), (95, 102), (50, 69), (74, 90), (73, 83), (33, 48), (80, 98), (17, 22), (52, 58), (53, 70), (87, 107), (48, 62), (5, 23), (59, 66), (14, 27), (27, 40), (95, 105), (67, 79), (83, 103), (28, 44), (64, 78), (93, 109), (43, 52), (1, 20), (47, 52), (83, 92), (92, 100), (81, 90), (85, 98), (1, 18), (49, 60), (46, 61), (98, 115), (39, 58), (51, 65), (81, 87), (13, 25), (51, 63), (67, 78), (2, 12), (73, 86), (88, 94), (15, 27), (5, 25), (68, 80), (33, 52), (9, 25), (32, 47), (83, 91), (10, 23), (15, 33), (18, 28), (22, 36), (98, 110), (3, 18), (51, 69), (20, 27)]

Δηλαδή:

  • το πρώτο διάβασμα περιέχει το χρωμόσωμα στις θέσεις 44 μέχρι και 60.
  • Το δεύτερο διάβασμα περιέχει το χρωμόσωμα στις θέσεις 83 μέχρι και 102.
  • κτλ..

Φτιάξτε μία συνάρτηση η οποία θα δέχεται μία παράμετρο. Η παράμετρος είναι μία λίστα όπως η reads. Η συνάρτηση επιστρέφει τη θέση του χρωμοσώματος η οποία έχει διαβαστεί τις περισσότερες φορές.

Για παράδειγμα αν πάρουμε μόνο τα 1ο (44, 60) και το 3ο read (30,47) παρατηρούμε ότι οι θέσεις 44,45,46,47 έχουν διαβαστεί από 2 φορές. Ποια είναι η θέση η οποία έχει διαβαστεί τις περισσότερες φορές αν πάρουμε όλα τα reads;

Άσκηση 96

Ένα πείραμα αλληλούχισης έκανε πολλά "διαβάσματα" (reads) ενός χρωμοσώματος το οποίο αποτελείται από 115 νουκλεοτίδια. Κάθε διάβασμα σε αυτό το πείραμα περιέχει ένα μικρό υποσύνολο της συνολικής ακολουθίας. Οι θέσεις τις οποίες ξεκινούν και τελειώνουν αυτά τα διαβάσματα είναι:

reads = [(95, 105), (46, 57), (28, 44), (89, 97), (24, 32), (29, 36), (37, 48), (9, 23), (38, 52), (78, 93), (85, 101), (2, 21), (81, 91), (49, 54), (9, 15), (11, 19), (17, 32), (82, 99), (50, 58), (86, 99), (58, 75), (8, 24), (39, 49), (19, 39), (42, 52), (93, 111), (89, 109), (86, 95), (26, 46), (42, 61), (65, 71), (49, 63), (64, 74), (62, 76), (56, 76), (82, 88), (10, 20), (13, 26), (31, 51), (97, 113)]

Δηλαδή:

  • το πρώτο διάβασμα περιέχει το χρωμόσωμα στις θέσεις 95 μέχρι και 105.
  • Το δεύτερο διάβασμα περιέχει το χρωμόσωμα στις θέσεις 46 μέχρι και 57.
  • κτλ..

Φτιάξτε μία συνάρτηση η οποία δέχεται μία παράμετρο. Η παράμετρος είναι μία λίστα όπως η reads. Η συνάρτηση επιστρέφει μία λίστα από όλες τις θέσεις οι οποίες δεν έχουν διαβαστεί καμία φορά. Η συνάρτηση θα πρέπει να υπολογίζει το μέγεθος του χρωμοσώματος ως τη μεγαλύτερη θέση η οποία έχει διαβαστεί. Στο παράδειγμά μας η μεγαλύτερη θέση είναι η 113.

Άσκηση 97

Ένα πείραμα αλληλούχισης έκανε πολλά "διαβάσματα" (reads) ενός χρωμοσώματος το οποίο αποτελείται από 115 νουκλεοτίδια. Κάθε διάβασμα σε αυτό το πείραμα περιέχει ένα μικρό υποσύνολο της συνολικής ακολουθίας. Οι θέσεις τις οποίες ξεκινούν και τελειώνουν αυτά τα διαβάσματα είναι:

reads = [(44, 60), (83, 102), (30, 47), (56, 74), (37, 50), (73, 81), (81, 96), (85, 100), (73, 80), (61, 76), (48, 64), (81, 99), (65, 85), (48, 61), (64, 74), (39, 57), (41, 51), (60, 68), (55, 71), (35, 52), (90, 110), (1, 21), (46, 51), (56, 63), (95, 102), (50, 69), (74, 90), (73, 83), (33, 48), (80, 98), (17, 22), (52, 58), (53, 70), (87, 107), (48, 62), (5, 23), (59, 66), (14, 27), (27, 40), (95, 105), (67, 79), (83, 103), (28, 44), (64, 78), (93, 109), (43, 52), (1, 20), (47, 52), (83, 92), (92, 100), (81, 90), (85, 98), (1, 18), (49, 60), (46, 61), (98, 115), (39, 58), (51, 65), (81, 87), (13, 25), (51, 63), (67, 78), (2, 12), (73, 86), (88, 94), (15, 27), (5, 25), (68, 80), (33, 52), (9, 25), (32, 47), (83, 91), (10, 23), (15, 33), (18, 28), (22, 36), (98, 110), (3, 18), (51, 69), (20, 27)]

Δηλαδή:

  • το πρώτο διάβασμα περιέχει το χρωμόσωμα στις θέσεις 44 μέχρι και 60.
  • Το δεύτερο διάβασμα περιέχει το χρωμόσωμα στις θέσεις 83 μέχρι και 102.
  • κτλ..

Φτιάξτε μία συνάρτηση η οποία δέχεται μία παράμετρο. Η παράμετρος είναι μία λίστα όπως η reads. Η συνάρτηση επιστρέφει τον μέσο όρο από το πλήθος των reads που περιέχουν τη κάθε μία από τις θέσεις του χρωμοσώματος. Για παράδειγμα ας υποθέσουμε ότι:

  • τη θέση 1 τη περιέχουν 3 reads.
  • τη θέση 2 τη περιέχουν 4 reads.
  • τη θέση 3 τη περιέχουν 2 reads.

Τότε ο μέσος όρος των διαβασμάτων (reads) των θέσεων από το 1 μέχρι και το 3 είναι (3+4+2)/3 = 3.

Εμείς θέλουμε τον μέσο όρο των διαβασμάτων όλων των θέσεων της ακολουθίας (ακόμα και αυτών που ενδεχομένως να μην έχουν διαβαστεί καμία φορά). Η συνάρτηση θα πρέπει να υπολογίζει το μέγεθος του χρωμοσώματος ως τη μεγαλύτερη θέση η οποία έχει διαβαστεί. Στο παράδειγμά μας η μεγαλύτερη θέση είναι η 115.

Άσκηση 98

Φτιάξτε τη συνάρτηση με το όνομα f η οποία παίρνει ως παράμετρο 2 αριθμούς: i,j. Η συνάρτηση θα πρέπει να επιστρέφει τη τιμή της έκφρασης: (i+j)/(i*j)

Φτιάξτε τη συνάρτηση με το όνομα g η οποία θα παίρνει ως παράμετρο 1 ακέραιο θετικό αριθμό N μικρότερο ή ίσο με το 100. Η συνάρτηση θα επιστρέφει το άθροισμα: f(1,1) + f(1,2) + f(1,3) + ... + f(1,Ν).

Φτιάξτε μία συνάρτηση με το όνομα h η οποία δεν θα παίρνει καμία παράμετρο. Η συνάρτηση θα επιστρέφει τη τιμή του αθροίσματατος: g(1) + g(2) + ... + g(100).

Άσκηση 99

Έστω το παρακάτω string:

a = '''
#CHROM  POS     ID      REF     ALT     QUAL
chr19   617614  .       G       A       39.2648
chr19   617804  .       G       A       0.309945
chr19   617959  .       A       C       0.0608339
chr19   618159  .       A       G       193.704
chr19   618428  .       T       G       1.87498E-5
chr19   618851  .       T       C       74.4613
chr19   618854  .       G       A       74.4613
chr19   618911  .       T       G       2.88308E-4
chr19   619021  .       G       C       352.245
chr19   619139  .       G       A       137.482
chr19   619408  .       A       G       207.722
chr19   619574  .       T       G       594.095
chr19   619772  .       G       C       612.352
chr19   619913  .       T       C       276.649
chr19   620004  .       T       C       0.00524165
chr19   620045  .       A       T       15.5734
chr19   620201  .       A       C       5.61107E-5
chr19   620210  .       A       C       1.63995E-5
chr19   620214  .       T       C       3.42253E-5
chr19   620228  .       A       C       8.62681E-4
chr19   620299  .       C       A       6.06919
chr19   620315  .       A       C       3.3417E-4
chr19   620381  .       T       G       5.01393E-4
chr19   620414  .       A       C       6.37073E-6
chr19   620429  .       T       C       2.46975E-5
chr19   620454  .       A       C       4.25049E-5
chr19   620459  .       T       C       4.96425E-5
chr19   620728  .       A       G       0.0198511
chr19   620807  .       G       A       41.4442 
'''

Όπως βλέπετε περιέχει πληροφορίες για διάφορες μεταλλάξεις στο χρωμόσωμα 19.

  • Η 1η στήλη περιέχει το χρωμόσωμα και μπορείτε να την αγνοήσετε.
  • Η 2η στήλη περιέχει τη θέση της μετάλλαξης και μπορείτε να την αγνοήσετε.
  • Η 3η στήλη περιέχει ένα ID το οποίο είναι πάντα . και μπορειτε να το αγνοήσετε.
  • Η 4η στήλη περιέχει το νουκλεοτίδιο αναφοράς (reference)
  • Η 5η στήλη περιέχει το εναλλακτικό (alternative) νουκλεοτίδιο το οποίο εντοπίστηκε σε αυτή τη μετάλλαξη.
  • Η 6η στήλη περιέχει τη ποιότητα (quality) της αλληλούχισης σε αυτή τη θέση και μπορείτε να την αγνοήσετε.

Γνωρίζουμε επίσης από τη βιολογία ότι:

  • Τα νουκλεοτίδια Α,G ονομάζονται και πουρίνες, ενώ τα νουκλεοτίδια T,C ονομάζονται και πυριμιδίνες.
  • Μία σημειακή μετάλλαξη μπορεί να είναι ή μετάβαση ή μετατροπή.
    • Μία μετάλλαξη λέμε ότι είναι μετάβαση όταν μία πουρίνη αλλάζει σε πουρίνη (A ↔ G) ή όταν μία πυριμιδινη αλλάζει σε πυριμιδίνη (C ↔ T).
    • Μία μετάλλαξη λέμε ότι είναι μετατροπή όταν μια βάση πουρίνης αλλάζει με μια βάση πυριμιδίνης ή μια βάση πυριμιδίνης αλλάζει με μια βάση πουρίνης.

Για παράδειγμα:

  • Η 1η μετάλλαξη είναι μετάβαση αφού μια πουρίνη (G) αλλάζει σε πουρίνη (Α).
  • Η 3η μετάλλαξη είναι μετατροπή αφού μία πουρίνη (A) αλλάζει σε πυριμιδίνη (C).

Φτιάξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρο. Η παράμετρος θα είναι ένα string όπως το a. Η συνάρτηση θα επιτρέφει τον λόγο των μεταβάσεων/μετατροπών που περιέχει το string a. Για παράδειγμα αν το a έχει 2 μεταβάσεις και 4 μετατροπες, τότε η συνάρτηση θα πρέπει να επιστρέψει 0.5 (2/4).

Άσκηση 100

Έστω το παρακάτω string:

a = '''
#CHROM  POS     ID      REF     ALT     QUAL
chr19   617614  .       G       A       39.2648
chr19   617804  .       G       A       0.309945
chr19   617959  .       A       C       0.0608339
chr19   618159  .       A       G       193.704
chr19   618428  .       T       G       1.87498E-5
chr19   618851  .       T       C       74.4613
chr19   618854  .       G       A       74.4613
chr19   618911  .       T       G       2.88308E-4
chr19   619021  .       G       C       352.245
chr19   619139  .       G       A       137.482
chr19   619408  .       A       G       207.722
chr19   619574  .       T       G       594.095
chr19   619772  .       G       C       612.352
chr19   619913  .       T       C       276.649
chr19   620004  .       T       C       0.00524165
chr19   620045  .       A       T       15.5734
chr19   620201  .       A       C       5.61107E-5
chr19   620210  .       A       C       1.63995E-5
chr19   620214  .       T       C       3.42253E-5
chr19   620228  .       A       C       8.62681E-4
chr19   620299  .       C       A       6.06919
chr19   620315  .       A       C       3.3417E-4
chr19   620381  .       T       G       5.01393E-4
chr19   620414  .       A       C       6.37073E-6
chr19   620429  .       T       C       2.46975E-5
chr19   620454  .       A       C       4.25049E-5
chr19   620459  .       T       C       4.96425E-5
chr19   620728  .       A       G       0.0198511
chr19   620807  .       G       A       41.4442 
'''

Όπως βλέπετε περιέχει πληροφορίες για διάφορες μεταλλάξεις στο χρωμόσωμα 19.

  • Η 1η στήλη περιέχει το χρωμόσωμα.
  • Η 2η στήλη περιέχει τη θέση της μετάλλαξης.
  • Η 3η στήλη περιέχει ένα ID το οποίο είναι πάντα . .
  • Η 4η στήλη περιέχει το νουκλεοτίδιο αναφοράς (reference)
  • Η 5η στήλη περιέχει το εναλλακτικό (alternative) νουκλεοτίδιο το οποίο εντοπίστηκε σε αυτή τη μετάλλαξη.
  • Η 6η στήλη περιέχει τη ποιότητα (quality) της αλληλούχιστης σε αυτή τη θέση.

Φτιάξτε μία συνάρτηση η οποία θα παίρνει μία παράμετρος. Η παράμετρος θα είναι ένα string όπως το a. Η συνάρτηση θα:

  • φτιάχνει ένα pandas DataFrame με όλες τις στήλες και γραμμές που περιέχει το a.
  • Χρησιμοποιώντας αυτό το DataFrame επιστρέφει το ζευγάρι από reference/alternative (4η και 5η στήλη) το οποίο είναι και το πιο κοινό.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment