Python dictionaries

Python dictionaries

Dictionaries

Dictionary нь list-тэй ижил, гэхдээ арай ерөнхий. List-д байрлал заасан index нь бүхэл тоо байдаг бол dictionary-д index нь ямар ч төрөлтэй байх боломжтой.

Dictionary-ийн index-ийг key гэж нэрлэдэг, түүнд хамаарах утгыг value гэнэ. Key ба Value хослолын mapping (харгалзуулсан хамаарал) гэж ойлгож болно. Key бүрт value хамаардаг. Key болон value-ийн холбоог key-value pair эсвэл item гэж нэрлэдэг.

dict function нь шинээр дотроо ямар ч item-гүй dictionary үүсгэдэг. Учир нь dict гэдэг нь built-in function юм. Тиймээс үүнийг variable нэрлэхдээ ашиглахаас зайлсхийгээрэй.

                        
                            >>> eng2sp = dict()
                            >>> print(eng2sp)
                            {}
                        
                    

Угалзан хаалт {} нь хоосон dictionary дүрсэлдэг. Түүнрүү item нэмэхийн тулд дөрвөлжин хаалт хэрэглэж болно:

                        
                            >>> eng2sp['one'] = 'uno'
                        
                    

Дээрх мөр нь 'one' гэдэг key-д 'uno' гэдэг value-г харгалзууоан оноож өгч байна. Хэрэв одоо dictionary-ийг дахин хэвлэвэл дундаа colon-той ( key-value хослолыг харна:)

                        
                                >>> print(eng2sp)
                                {'one': 'uno'}
                        
                    

Dictionary-ийг бас дараах байдлаар үүсгэж болно:

                        
            >>> eng2sp = {'one': 'uno', 'two': 'dos', 'three': 'tres'}
            >>> print(eng2sp)
            {'one': 'uno', 'two': 'dos', 'three': 'tres'}
                        
                    

Dictionary-ийн element-үүдийн index нь бүхэл тоогоор байдаггүй учраас зохих value-г харахын тулд түүнд хамаарах key-г нь ашиглана:

                        
                            >>> print(eng2sp['two'])
                            'dos'
                        
                    

len function dictionary дээр ч бас ажиллах бөгөөд key-value pair-уудын тоог буцаадаг:

                        
                            >>> len(eng2sp)
                            3
                        
                    

in оператор нь dictionary-д ямар нэг key-ийг байгаа эсэхийг шалгадаг:

                        
                            >>> 'one' in eng2sp
                            True
                            >>> 'uno' in eng2sp
                            False
                        
                    

Харин ямар нэг value-г dictionary дотор байгаа эсэхийг шалгахдаа values method-ийг ашиглаж болно. Үүнийг хийхийн тулд value-нуудыг list болгож хувиргаад дараа нь түүн дээрээ in операторыг ашигладаг.

                        
                            >>> vals = list(eng2sp.values())
                            >>> 'uno' in vals
                            True
                        
                    

in оператор нь list болон dictionary дээр өөр өөрөөр ажилладаг. List-ийн хувьд шугаман байдлаар хайлт хийдэг. Тиймээс list уртсах тусам хайлт хийх хугацаа уртасна гэсэн үг. Харин dictionary-ийн хувьд hash table гэдэг алгоритм ажилладаг. Ингэснээр dictionary-д хэдэн item байхаас үл хамааран хайлтад ижил хугацаа зарцуулдаг.

Dictionary as a set of counters

Dictionary as a set of counters

Танд нэг string өгөгдсөн байгаа бөгөөд тэнд тухайн нэг үсэг хэдэн удаа давтагдаж байгааг олох хэрэгтэй болсон гэж бодъё. Үүнийг хийх хэд хэдэн арга байна:

Үүнийг хийх хэд хэдэн арга байна:

  1. Үсгүүдийг нэг нэгээр нь агуулсан variable зарлаж болно (Монгол үсгээр үүсгэлээ гэхэд 35 ширхэг variable үүсгэнэ). Дараа нь string дэх тэмдэгт бүрийг харьцуульж chained conditional ашиглан шалгаж болно.
  2. Бүх үсгийг агуулсан list үүсгэж болно. Дараа нь тэмдэгт бүрийг тоо болгон хувиргана. Тэгээд тоонуудыг list-ийнхээ index болгон ашиглана.
  3. Үсэгнүүдийг key болгоод value-д нь counter оноож өгнө. Тэгээд тухайн үсэг эхний удаа гарч ирэх үед dictionary-д нэг item нэмнэ. Тэгээд тухайн item-ийн value-г нэмэгдүүлнэ.

Дээрх хувилбарууд нь яг ижил тооцоолол хийх боловч implement хийх арга замууд нь өөр.

implementation гэдэг нь тооцоолол хийх гэсэн үг. Dictionary ашигласан implementation-ийн давуу тал нь бидэнд аль үсэг хэдэн удаа давтагдаж байгааг мэдэх шаардлагагүй зөвхөн үсэг бүрд зориулсан өрөө үүсгээд давтагдах үед нь барьж авахад л болно:

                        
                            word = 'brontosaurus'
                            d = dict()
                            for c in word:
                            if c not in d:
                            d[c] = 1
                            else:
                            d[c] = d[c] + 1
                            print(d)
                        
                    

For loop нь string дээгүүр явна. Loop хийгдэх үед жишээ нь, хэрэв 'а' үсэг dictionary дотор байхгүй бол шинээр 'а' гэдэг key үүсгэж 1 гэсэн анхны утга өгнө (тухайн үсэг анх удаа гарч ирж байгаа үед). Харин 'a' үсэг аль хэдийнэ байсан бол түүний value-г 1-ээр нэмэгдүүлнэ.

Дээрх программын гаргах үр дүн:

                        
        {'b': 1, 'r': 2, 'o': 2, 'n': 1, 't': 1, 's': 2, 'a': 1, 'u': 2}
                        
                    

Dictionary нь key болон default value гэсэн 2 параметр авдаг get гэдэг method-той. Хэрэв key тухайн dictionary дотор байвал get нь түүнд харгалзах value-г буцаана. Харин байхгүй бол default value буцаадаг:

                        
                        >>> counts = {'chuck': 1, 'annie': 42, 'jan': 100}
                        >>> print(counts.get('jan', 0))
                        100
                        >>> print(counts.get('tim', 0))
                        0
                        
                    

get-ийг ашигласнаар бид for loop-ийг илүү хялбар хийх боломжтой. Учир нь get method нь dictionary-д key байгаа үгүйг автоматаар хянадаг. Үүнийг ашигласнаар бид 4 мөр бүхий if statement-ийг 1 мөр болгож багасгаж болно:

                        
                            word = 'brontosaurus'
                            d = dict()
                            for c in word:
                            d[c] = d.get(c, 0) + 1
                            print(d)
                        
                    

Dictionaries and files

Dictionaries and files

Dictionary ашиглах бас нэг түгээмэл тохиолдол нь ямар нэг file дээр нэг үг хэдэн удаа давтагдаж байгааг олох юм.

Эхний жишээнд теĸстийн товчилсон хувилбарыг цэг таслалгүй ашиглая. (Дараа нь цэг таслал бүхий теĸстийг ашиглана.)

                        
                But osft hwat light through yonder window breaks
                It is the east and Juliat is the sun
                Arise fair sun and kill the envious moon
                Who is already sick and pale with grief
                        
                    

Дараах ĸодонд 2 for loop байна. Гаднах loop нь file дахь мөрүүдийг уншиж түүний доторх loop нь тухайн мөрөнд байгаа үг бүрийг уншина. Ийм loop-ийг nested loop гэнэ.

                        
                    fname = input('Enter the file name: ')
                    try:
                        fhand = open(fname)
                    except:
                        print('File cannot be opened: ', fname)
                        exit()
                    counts = dict()
                    for line in fhand:
                        words = line.split()
                        for word in words:
                            if word not in counts:
                                counts[word] = 1
                            else:
                                counts[word] += 1
                    print(counts)
                        
                    

else statement-д хувьсагчийн утгыг нэмэгдүүлэхдээ товч бичиглэл ашигласан байна. counts[word]+= 1 гэдэг нь counts[word] = counts[word] + 1 гэдэгтэй ижил үйлдэл хийнэ. Энэ хялбар бичиглэл нь мөн -=, *=, /= дээр ч ажиллана.

Программыг ажиллуулах үед дараах үр дүн гарна: romeo.txt_link file-ийг татаж аваад туршиж үзээрэйa

Хамгийн их давтагдсан үгсийг dictionary-с олох гэж хайх нь жаахан төвөгтэй. Тиймээс үүнд зориулан ĸод бичиж болно.

                        
    pytho count1.py
    Enter the file name: romeo.txt
    {'But': 1, 'soft': 1, 'what': 1, 'light': 1, 'through': 1, 'yonder': 1,
    'window': 1, 'breaks': 1, 'It': 1,
    'is': 3, 'the': 3, 'east': 1, 'and': 3, 'Juliet': 1, 'sun': 2, 'Arise': 1,
    'fair': 1, 'kill': 1, 'envious': 1,
    'moon': 1, 'Who': 1, 'already': 1, 'sick': 1, 'pale': 1, 'with': 1,
    'grief': 1}
                        
                    

Looping and dictionaries

Looping and dictionaries

for loop-ийг dictionary дээр хэрэглэх үед энэ нь dicitonary-ийн key-үүдийг шалгадаг. Доорх loop нь key бүрийг харгалзах value-тай хэвлэнэ:

                        
                    counts = {'chuck': 1, 'annie': 42, 'jan': 100}
                    for key in counts:
                        print(key, counts[key])
                        
                    

Дээрхийг ажиллуулахад гарах үр дүн нь:

                        
                                    chuck 1
                                    annie 42
                                    jan 100
                        
                    

Өмнө нь үзсэн олон төрлийн давталтыг мөн ашиглаж болно. Жишээ нь, хэрэв value нь 10-аас илүү байгаа хэсгийг dictionary-с олохыг хүсвэл дараах ĸодыг ажиллуулж болно:

                        
                    counts = {'chuck': 1, 'annie': 42, 'jan': 100}
                    for key in counts:
                        if counts[key] > 10:
                            print(key, counts[key])
                        
                    

for loop нь dictionary дахь key-нүүдийг дамжин явах бөгөөд key бүрт харгалзах утгыг олохын тулд index operator-ийг ашиглана. Дээрх ĸодын үр дүн:

                        
                                    annie 42
                                    jan 100
                        
                    

Одоо бид value нь зөвхөн 10-аас их байгаа утгуудыг харж байна.

Хэрэв print хийхдээ key-нүүдийг цагаан толгойн дарааллаар харахыг хүсвэл эхлээд keys method-ийг ашиглан key-нүүдийг агуулсан list үүсгээд түүн дээрээ sort хийнэ. Дараа нь sort хийсэн list дээрээ loop ажиллуулж үсгийг дарааллын дагуу хэвлэж болно:

                        
                        counts = {'chuck': 1, 'annie': 42, 'jan': 100}
                        lst = list(counts.keys())
                        print(lst)
                        lst.sort()
                        for key in lst:
                            print(key, counts[key])
                        
                    

Үр дүн:

                        
                            ['chuck', 'annie', 'jan']
                            annie 42
                            chuck 1
                            jan 100
                        
                    

Advanced text parsing

Advanced text parsing

Өмнөх жишээнд romeo.txt file дахь теĸстийг аль болох энгийн болгохын тулд бүх цэг тэмдгүүдийг арилгасан. Жинхэнэ теĸст нь ингэж харагдана:

                        
                    But, soft! what light through yonder window breaks?
                    It is the east, and Juliet is the sun.
                    Arise, fair sun, and kill the envious moon,
                    Who is already sick and pale with grief,
                        
                    

Python-гийн split function нь үгнүүдийг хоосон зайгаар тусгаарлагдсан тэмдэгтүүд гэж үздэг бөгөөд 'soft!' болон 'soft'-ийг өөр өөр үг болгоод үг болгонд тусад нь dictionary-ийн тэмдэглэгээ үүсгэдэг.

Мөн file-д том үсэг орсон үед 'who' болон 'Who'-г өөр өөр үг гэж үзээд тусад нь тоолно.

Дээрх 2 асуудлыг шийдэхийн тулд lower, punctuation, translate гэсэн string method-уудыг ашигладаг. translate арга нь method-уудаас хамгийн нарийн нь.

                        
            line.translate(str.maketrans(fromstr, tostr, deletestr))
                        
                    

fromstr байрлалд байгаа тэмдэгтүүдийг tostr байрлалд байгаа тэмдэгтээр сольж deletestr байрлалд байгаа тэмдэгтүүдийг устгана.

Бид tostr-ийг ашиглахгүй deletestr-ийг ашиглаж бүх цэг таслалыг устгана.

Python-д цэг таслал гэж үздэг тэмдэгтүүдийг мэдэх:

                        
                    >>> import string
                    >>> string.punctuation
                    '!"#$%&\'()*+,-./:;< = >?@[\\]^_`{|}~'
                        
                    

Програмдаа дараах өөрчлөлтүүдийг оруулъя:

                        
        import string
        fname = input('Enter the file name: ')
        try:
        fhand = open(fname)
        except:
        print('File cannot be opened:', fname)
        exit()
        counts = dict()
        for line in fhand:
        line = line.rstrip()
        line = line.translate(line.maketrans('', '', string.punctuation))
        line = line.lower()
        words = line.split()
        for word in words:
        if word not in counts:
        counts[word] = 1
        else:
        counts[word] += 1
        print(counts)
                        
                    

Үр дүн:

                        
    Enter the file name: romeo-full.txt
    {'romeo': 40, 'and': 42, 'juliet': 32, 'act': 1, '2': 2, 'scene': 2, 'ii':
    1, 'capulets': 1, 'orchard': 2,
    'enter': 1, 'he': 5, 'jests': 1, 'at': 9, 'scars': 1, 'that': 30, 'never':
    2, 'felt': 1, 'a': 24, 'wound': 1,
    'appears': 1, 'above': 6, 'window': 2, 'but': 18, 'soft': 1, 'what': 11,
    'light': 5, 'through': 2, 'yonder': 2,
    'breaks': 1, ...}