Python Key, Value ile String Değerin Sayısal Karşılığı Nasıl Bulunur?

Arkadaşlar merhaba, normal şartlarda bu tarz kişisel soruları pek sormam fakat bu sorudaki olayı kesinlikle anlamadım. Nasıl yapabilirim?

Aşağıda verilen key ve value değerleri ile girilen string değer içindeki kelime sayısal değere dönecek. Yani mesela “s” harfi 3.sırada olduğu için 777 yazacak. Bunu nasıl yapabilirim fikir verirseniz sevinirim.Screenshot_2020-07-04_21-12-06

Sanırım şu kastedilmiş, 7 anahtarının karşısında PRS var ve S buradaki üçüncü harf. Bu yüzden S’ye karşılık olarak 777 gelecek.

Evet aynen öyle. Nasıl yapacağımı çözemedim, stringe bunları nasıl karşılık getireceğim. Sanırım stringi split edeceğim ama çıkan değerleri nasıl bunun içinde gezdireceğim.

Şuradaki mantık işinizi görecektir:

user = input(">> ")

index = (len(user))
gezin = 0
uretici = list()
sonuc = list()

while True:
  
  uretici.append(user[gezin])
  gezin += 1
  
  if gezin == index:
    break
  
for i in uretici:
  
  if i == "a":
    i = 2
    sonuc.append(i)
  
  if i == "b":
    i = 22
    sonuc.append(i)
    
  if i == "c":
    i = 222
    sonuc.append(i)
    
  if i == "ç":
    i = 2222
    sonuc.append(i)
    
print(uretici)
print(sonuc)

bu tarz bir şey iş görür mü? yoksa çok mu amelelik gibi görünür :frowning: :slight_smile:

daha sonra sonuc listesi içerisindeki uzunluk kadar indeks hesaplayarak bir değişkene değeri tanımlanabilir

d = (
    ("0", [" "]),
    ("1", [".", ",", "?", ":", ";", "!"]),
    ("2", ["A", "B", "C", "Ç"]),
)

# Gerisine üşendim.

userentered = input("Enter: ")

c = False
for oge in d:
    for char in oge[1]:
        if char == userentered:
            i = oge[1].index(char)
            
            print(oge[0] * (i+1))
            c = True
            
assert c

Bu şekilde.

Sonuç:

Enter: ?
111

Şu şekilde de fonksiyona dökülebilir:

def get_numeric_value(userentered, d): # Fonksiyona ad veremedim yav :D
    c = False
    for oge in d:
        for char in oge[1]:
            if char == userentered:
                i = oge[1].index(char)
                
                return (oge[0] * (i+1))
                c = True
                
    if not c:
        return False

1 Beğeni

Çok uzun olacaktır hocam :confused:

Herhangi bir çıktı dönmedi maalesef.

Her seferinde sözlüğün içinde dolaşmaktansa bir kere sözlük yapıp her seferinde onu kullansak?

old_dict = {
	0: [' '],
	1: ['.', ',', '?', ':', ';', '!'],
	2: ['A', 'B', 'C', 'Ç'],
	3: ['D', 'E', 'F'],
	4: ['G', 'Ğ', 'H', 'I'],
	5: ['İ', 'J', 'K', 'L'],
	6: ['M', 'N', 'O', 'Ö'],
	7: ['P', 'R', 'S'],
	8: ['Ş', 'T', 'U', 'Ü'],
	9: ['V', 'Y', 'Z'],
}

def index_times_key_dict(dict_):
	new_dict = {}

	for key, values in dict_.items():
		for value_index, value in enumerate(values, 1):
			new_dict[value] = value_index * str(key)
	
	return new_dict

new_dict = index_times_key_dict(dict_)
#{' ': '0', '.': '1', ',': '11', '?': '111', ':': '1111', ';': '11111', '!': '111111', 'A': '2', 'B': '22', 'C': '222', 'Ç': '2222', 'D': '3', 'E': '33', 'F': '333', 'G': '4', 'Ğ': '44', 'H': '444', 'I': '4444', 'İ': '5', 'J': '55', 'K': '555', 'L': '5555', 'M': '6', 'N': '66', 'O': '666', 'Ö': '6666', 'P': '7', 'R': '77', 'S': '777', 'Ş': '8', 'T': '88', 'U': '888', 'Ü': '8888', 'V': '9', 'Y': '99', 'Z': '999'}
value1 = new_dict["S"]
value2 = new_dict["Z"]

Yok başka sözlük mözlük derseniz:

dict_ = {
	0: [' '],
	1: ['.', ',', '?', ':', ';', '!'],
	2: ['A', 'B', 'C', 'Ç'],
	3: ['D', 'E', 'F'],
	4: ['G', 'Ğ', 'H', 'I'],
	5: ['İ', 'J', 'K', 'L'],
	6: ['M', 'N', 'O', 'Ö'],
	7: ['P', 'R', 'S'],
	8: ['Ş', 'T', 'U', 'Ü'],
	9: ['V', 'Y', 'Z'],
}

def index_times_key(dict_, match_value):
	for key, values in dict_.items():
		for value_index, value in enumerate(values, 1):
			if value == match_value:
				return value_index * str(key)
	raise KeyError(f"there is no value: `{match_value}` in the dict")

print(index_times_key(dict_, "S"))
# '777'
2 Beğeni

Bu tek harf içindi hocam. Size istediğiniz versiyonunu da atıyorum.

1 Beğeni
d = (
    ("0", [" "]),
    ("1", [".", ",", "?", ":", ";", "!"]),
    ("2", ["A", "B", "C", "Ç"]),
)

# Gerisine üşendim.

userentered = input("Enter: ")

for harf in userentered:
    c = False
    for oge in d:
        for char in oge[1]:
            if char == harf:
                i = oge[1].index(char)
                
                print(oge[0] * (i+1))
                c = True
                
    assert c

Aynen, bu daha mantıklı.

1 Beğeni

Bundan şifreleme algoritması çıkmaz mı ki?

1 Beğeni

Denedim lakin kelime verdiğim vakit hata veriyor.

Bunda da çalışıyor fakat 2 yerine 21 yazıyor mesela ilk harfe geldiği vakit 2 yazması gerekiyor ikinci harfe gelince 22, 3 222 gibi.

Hayır, bende öyle yazmıyor.

Enter: BABA
22
2
22
2

IDE yüzünden galiba şu an Thonny ile açtım herhangi bir sıkıntı yok teşekkür ederim. Bir de yan yana yazmak için print arasına +""+ ekleyince hata veriyor, başka nasıl yazabilirim?

Şöyle;

d = (
    ("0", [" "]),
    ("1", [".", ",", "?", ":", ";", "!"]),
    ("2", ["A", "B", "C", "Ç"]),
)

# Gerisine üşendim.

userentered = input("Enter: ")

for char in userentered:
    c = False
    for oge in d:
        for listchar in oge[1]:
            if listchar == char:
                i = oge[1].index(listchar)
                
                print(oge[0] * (i+1), end=" ")
                c = True
                
    assert c
print()
1 Beğeni

Çok teşekkür ederim, sorun çözüldü arkadaşlar. Çok sağolun hepiniz.

1 Beğeni
keymap = {
    ' ': "0",
    '.': "1",
    ',': "11",
    ...
    'S': "777"
    ...
}
1 Beğeni