Advanced Examples of Using Dictionaries and Lists in Python Programming

Slide Note
Embed
Share

Explore more advanced techniques such as dictionary manipulation, list operations, pattern matching with regular expressions, and using simple programs to solve complex problems in Python programming. Discover methods like cryptanalysis, code breaking, frequency analysis, and rail fence decryption to enhance your programming skills.


Uploaded on Oct 09, 2024 | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

E N D

Presentation Transcript


  1. Python Programming in Context Chapter 8 Listings and Figures

  2. Objectives To understand more advanced examples of using a dictionary in Python To understand more advanced examples of using lists in Python To use pattern matching with regular expressions To learn how simple programs can help you solve more advanced problems

  3. Cryptanalysis Code Breaking Brute force Try all possibilities Frequency Analysis Use additional information to help find the correct decoding Word Dictionary Help to discover real words

  4. Breaking Rail Fence Try all possible numbers of rails Look for the most real words

  5. Listing 8.1 def createWordDict(dname): myDict = {} myFile = open(dname, r ) for line in myFile: myDict[line[:-1]] = True return myDict

  6. Listing 8.2 def railBreak(cipherText): wordDict = createWordDict('wordlist.txt') cipherLen = len(cipherText) maxGoodSoFar = 0 bestGuess = "No words found in dictionary" for i in range(1,cipherLen+1): words = railDecrypt(cipherText,i) goodCount = 0 for w in words: if w in wordDict: goodCount = goodCount + 1 if goodCount > maxGoodSoFar: maxGoodSoFar = goodCount bestGuess = " ".join(words) return bestGuess

  7. Listing 8.3 def railDecrypt(cipherText,numRails): railLen = len(cipherText) // numRails solution = '' for col in range(railLen): for rail in range(numRails): nextLetter = (col + rail * railLen) solution = solution + cipherText[nextLetter] return solution.split()

  8. Letter Frequency Analysis How often does each letter appear in a large text? Representative for all texts Use that information to help decode

  9. Figure 8.1

  10. Listing 8.4 def letterFrequency(text): text = text.lower() nonletters = removeMatches(text,alphabet) nonletters = removeDupes(nonletters) text = removeMatches(text,nonletters) lcount = {} total = len(text) for ch in text: lcount[ch] = lcount.get(ch,0) + 1 for ch in lcount: lcount[ch] = lcount[ch] / total return lcount

  11. Listing 8.5 def getFreq(t): return t[1]

  12. Listing 8.6 def maybeAdd(ch,toList): if ch in 'abcdefghijklmnopqrstuvwxyz' and ch not in toList: toList.append(ch)

  13. Neighbor Analysis Which letters appear most frequently next to another letter? Help to distinguish between common letters

  14. Listing 8.7 def neighborCount(text): nbDict = {} text = text.lower() for i in range(len(text)-1): nbList = nbDict.setdefault(text[i],[]) maybeAdd(text[i+1],nbList) nbList = nbDict.setdefault(text[i+1],[]) maybeAdd(text[i],nbList) for key in nbDict: nbDict[key] = len(nbDict[key]) return nbDict

  15. Listing 8.8 nbList = nbDict.get(text[i]) if nbList == None: nbDict[text[i]] = [] nbList = nbDict[text[i]]

  16. Listing 8.9 def maybeAdd(ch,toDict): if ch in 'abcdefghijklmnopqrstuvwxyz': toDict[ch] = toDict.setdefault(ch,0) + 1

  17. Figure 8.2

  18. Listing 8.10 def sortByLen (w) return len(w)

  19. Regular Expression Pattern matching library Wildcards Replacement

  20. Listing 8.11 def checkWord(regex): resList = [] wordFile = open('wordlist.txt') for line in wordFile: if re.match(regex,line[:-1]): resList.append(line[:-1]) return resList

  21. Listing 8.12 def checkWord(unused,pattern): resList = [] wordFile = open('wordlist.txt') rePat = '['+unused+']' regex = re.sub('[a-z]',rePat,pattern) + '$' regex = regex.lower() print('matching ', regex) for line in wordFile: if re.match(regex,line[:-1]): resList.append(line[:-1]) return resList

  22. Listing 8.13 def findLetters(unused,pattern): resList = [] wordFile = open('wordlist.txt') ctLetters = re.findall('[a-z]',pattern) print(ctLetters) rePat = '(['+unused+'])' regex = re.sub('[a-z]',rePat,pattern) + '$' regex = regex.lower() for line in wordFile: myMatch = re.match(regex,line[:-1]) if myMatch: matchingLetters = myMatch.groups() matchList = [] for l in matchingLetters: matchList.append(l.upper()) resList.append(line[:-1]) resList.append(zip(ctLetters,matchList)) return resList

Related