Więc moim celem w tym problemie jest, mając 2 ciągi znaków, str1 i str2, stworzyć słownik taki, że znaki w str1 są kluczami i odpowiadającymi im znakami w {{X3} } są wartościami.

To znaczy. crackthecode('apple','byytr') wraca {'a':'b','p':'y','l':'t','e':'r'} a jeśli jest niespójny, tj. crackthecode('apple','byptr') następnie wraca {}, pusty słownik.

To jest mój kod, po prostu nie jestem pewien, jak zrobić ten niespójny przypadek.

PS. Nie mogę użyć zip w przypadku tego pytania.

Poniżej znajduje się mój kod.

def crackthecode(str1, str2):
  final = {}
  x = 0
  for i in list(str1):
    final[i]=str2[x]
    x = x + 1
  return final

Doceniamy wszelką pomoc, dzięki!

0
Sania 20 listopad 2019, 07:32
1
Co masz na myśli przez 2 takie same klucze? klawisze dict są wyjątkowe i niezmienne!
 – 
Amit Karnik
20 listopad 2019, 07:44
2
@AmitKarnik. Chociaż tytuł jest nieco mylący, samo pytanie dość dobrze wyjaśnia, co oznacza OP
 – 
Mad Physicist
20 listopad 2019, 07:50
1
@Sania. Co byś zrobił dla crackthecode('apple', 'xxxxx')?
 – 
Mad Physicist
20 listopad 2019, 07:58
W takim przypadku zwrócisz pusty słownik {}
 – 
Sania
20 listopad 2019, 08:26
1
@Sania. Dlaczego? Żaden klucz nie jest niespójny ...
 – 
Mad Physicist
20 listopad 2019, 15:26

1 odpowiedź

Możesz sprawdzić, czy klucz jest już obecny w słowniku i porównać wartość z nowym znakiem. Jeśli nie są równe, zwróć pusty słownik. W przeciwnym razie dodaj parę klucz-wartość do słownika.

Możesz użyć tego kodu, który korzysta z zasady EAFP.

>>> def crackthecode(str1, str2):
    final = {}
    for i, key in enumerate(str1):
        try:
            if final[key] != str2[i]:
                return {}
        except KeyError:
            final[key] = str2[i]
    return final

>>> crackthecode('apple','byytr')
{'a': 'b', 'p': 'y', 'l': 't', 'e': 'r'}
>>> crackthecode('apple','byptr')
{}

Edycja: ten sam kod bez użycia enumerate (na żądanie OP)

def crackthecode(str1, str2):
    final = {}
    for i in range(len(str1)):
        try:
            if final[str1[i]] != str2[i]:
                return {}
        except KeyError:
            final[str1[i]] = str2[i]
    return final 
2
Keyur Potdar 22 listopad 2019, 10:05
Czy można to zrobić bez użycia enumerate?
 – 
Sania
20 listopad 2019, 08:27
Możesz po prostu użyć for i in range(len(str1)) i zmienić key na str1[i].
 – 
Keyur Potdar
20 listopad 2019, 08:28
Zmiana klucza na str1 [i] wydawała mi się nie działać, czy możesz mi pokazać, czego próbowałeś?
 – 
Sania
22 listopad 2019, 03:37