• 13-12-2022, 19:18:14
    #1
    Merhabalar. Python dilinde henüz acemi sayılırım. Onun için yapmak istediğim bir şeyi en kısa yolsan nasıl yapabileceğime dair yardım almak istiyorum. Uzun kodlarla yapabilirim ama dediğim gibi olabildiğince kısa bir yolu varsa onu öğrenmek istiyorum.
    Bir string türünde yazımız olsun
    string1 = '293 days 8 hours'
    string2 = '56 days 1 hour 24 minutes'
    Bu string değerlerden aşağıdaki gibi dict türünde veri elde etmem gerekiyor.
    dict1 = {
        'days': 293,
        'hours': 8
    }
    
    dict2 = {
        'days': 56,
        'hours': 1,
        'minutes': 24
    }
    Dikkat ederseniz string2 deki 'hour' yazısının hours olarak değişmesi (day, hour, minute için de aynı durum geçerli) ve değerlerin de int tipine dönüşmesi gerekiyor. Bu sözlükleri datetime.timedelta() fonksiyonuna **kwargs olarak göndereceğim için bu formata uygun olmaları gerekiyor.

    Öncelikli isteğim bu fakat bu string değerlerini başka kısa bir yoldan timestamp a dönüştürecek bir yöntem biliyorsanız o da olabilir
  • 13-12-2022, 23:13:47
    #2
    Bugün ikinci benzer konuyu yanıtlıyorum
    replacements'a yeni bir anahtar kelime eklerken renklendirdiğim şekilde eklerseniz daha sağlıklı çalışır. değişecek kelime farklı bir kelime yada ek almışsa değişmeyecektir.


    def get_dict(text):
        replacements = {r'\bday\b':'days',
                    r'\bhour\b':'hours',
                    r'\bminute\b':'minutes'}
        dic = {}
        for i, j in replacements.items():
                text = re.sub(i,j,text)
        keys = text.split(" ")
        for key in keys:
            if(key in replacements.values()):
                dic.update({key : int(keys[keys.index(key) - 1])})
    
        return dic
    örneğiniz için kullanım:

    string1 = '293 day 8 hour'
    string2 = '56 day 1 hour 24 minute'
    
    dict1 = get_dict(string1)
    dict2 = get_dict(string2)
    print(dict1)
    print(dict2)
    çıktısı:
    {'days': 293, 'hours': 8}
    {'days': 56, 'hours': 1, 'minutes': 24}
  • 13-12-2022, 23:46:53
    #3
    Hayrettin adlı üyeden alıntı: mesajı görüntüle
    Bugün ikinci benzer konuyu yanıtlıyorum
    replacements'a yeni bir anahtar kelime eklerken renklendirdiğim şekilde eklerseniz daha sağlıklı çalışır. değişecek kelime farklı bir kelime yada ek almışsa değişmeyecektir.


    def get_dict(text):
        replacements = {r'\bday\b':'days',
                    r'\bhour\b':'hours',
                    r'\bminute\b':'minutes'}
        dic = {}
        digits = re.findall("\\d+", text)
        s = 0
        for i, j in replacements.items():
            if(s < len(digits)):
                text = re.sub(i,j,text)
                dic.update({j:int(digits[s])})
                s += 1
        return dic
    örneğiniz için kullanım:

    string1 = '293 day 8 hour'
    string2 = '56 day 1 hour 24 minute'
    
    dict1 = get_dict(string1)
    dict2 = get_dict(string2)
    print(dict1)
    print(dict2)
    çıktısı:
    {'days': 293, 'hours': 8}
    {'days': 56, 'hours': 1, 'minutes': 24}
    Hocam yanıtınız için çok teşekkür ederim. Gayet güzel çalıştı elinize sağlık.
    Değiştirilecek verileri sözlükte tutma fikrini ben de başta denedim de sanırım eksik kontroller yaptığım için days olunca bile dayss şeklinde yer değiştirme yapıyordu
    Muhtemelen sizin yöntemi kullanırım da benim çözümüm hakkında ne düşünürsünüz
    kwargs = {}
    i = re.findall(r'(\d+ \w+)', text)
    for k in i:
        k = k + 's' if k[-1] != 's' else k
        sayi = re.findall(r'\d+', k)[0]
        text = re.findall(r'\w+s', k)[0]
        kwargs[text] = int(sayi)
  • 14-12-2022, 00:18:55
    #4
    Abdullahx adlı üyeden alıntı: mesajı görüntüle
    Hocam yanıtınız için çok teşekkür ederim. Gayet güzel çalıştı elinize sağlık.
    Değiştirilecek verileri sözlükte tutma fikrini ben de başta denedim de sanırım eksik kontroller yaptığım için days olunca bile dayss şeklinde yer değiştirme yapıyordu
    Muhtemelen sizin yöntemi kullanırım da benim çözümüm hakkında ne düşünürsünüz
    kwargs = {}
    i = re.findall(r'(\d+ \w+)', text)
    for k in i:
        k = k + 's' if k[-1] != 's' else k
        sayi = re.findall(r'\d+', k)[0]
        text = re.findall(r'\w+s', k)[0]
        kwargs[text] = int(sayi)
    çok daha iyi olmuş hocam ben bir önceki konudaki yanıt üzerinden devam edince asılda çok daha uzatmışım
    days hours minutes dışında bir key gelme ihtimali yoksa yeterli harici durumda onları kontrol ettirebilirsiniz gerekirse
    keys = ["days", "hours", "minutes"]
    if(text in keys):
    kwargs[text] = int(sayi)
    şeklinde