2016-03-31 26 views
1

Bir cypher yazıyorum ve alfabedeki her harfe alphabet_dictionary = {'a': 0, 'b': 1, 'c': 2,... etc.} sayısal değerler atadım.Bir python 3 sözlüğünde bir değer kullanarak nasıl anahtar bulunur?

Önce harfi message numarasına dönüştürüyorum, bazı aritmetik işlemleri yapın ve bu sayıları code adında bir değişkene kaydedin.

Onları harflere dönüştürmek istiyorum.

Şimdiye kadar var:

for number in code: 
    for letter, value in alphabet_dictionary.items(): 
     if value == number: 
      coded_message.append(letter) 

Bu çalışır. coded_message listemdeki doğru kodlanmış mesajla bitiriyorum. Daha iyi veya daha verimli bir şey var mı?

Neden bunu tek bir satırda yapamıyorum? İlk kullanarak çalıştı:

for number in code: 
    coded_message.append(letter for letter, value in alphabet_dictionary.items() if value == number) 

ama bu sadece örneğin bireysel karakterler için bellek ayırma adresini ekler:

`[<generator object <genexpr> at 0x1011bb240>, <generator object <genexpr> at 0x1011bb1f8>, <generator object <genexpr> at 0x1011bb288>, <generator object <genexpr> at 0x1011bb2d0>, <generator object <genexpr> at 0x1011bb318>, <generator object <genexpr> at 0x1011bb360>, <generator object <genexpr> at 0x1011bb3a8>]' 

neden oluyor?

+1

Olası yinelenen: kod çözme için

code = 'somestring' coded_message = map(alphabet_dictionary.__getitem__, code) 

68673/inverse-dictionary-lookup-python) –

+0

'coded_message' değerini kullanabileceğiniz tam olarak bir eşleşme olacağından kesinlikle eminseniz.append (sonraki) (value == sayı ise)(), letter = ifadesinin sonraki (ilk) değerini almak için [inverse dictionary lookup - Python] 'un kabul edilen yanıtı olarak alfabetik_dictionary.items() öğesindeki değeri ekleyin. : //stackoverflow.com/questions/2568673/inverse-dictionary-lookup-python) durumları: sözlüğün, sözlüğünde mevcut olduğu konusunda bir garanti yoktur. –

+0

sadece harfleri rakamlara bağladığınızdan, bir dizinin indeksini ve string.ascii_lowercase.index (char) 'karakterini bulmak için' string.ascii_lowercase [index] 'yi kullanabilirsiniz. –

cevap

1

letter için bellek konumlarını alamıyorsunuz, oluşturduğunuz jeneratörler olduğunu düşündükleri için bellek konumlarını alıyorsunuz. .append() tek bir argüman alır ve bir jeneratör-expr verdiğinizde, bu argüman olarak mutlu bir şekilde davranır ve ekler. @Tadhg McDonald-Jensen bahseder gibi Ya next gen-expr sarmak edebilir veya biraz ayrıntılı için .extend()

için .append() değiştirmeyi deneyebilirsiniz: bunu açık bir yaptıysanız,

x = letter for letter, value in alphabet_dictionary.items() if value == number 
type(x) ## generator-expression 
for i in x: 
    print(i) 
## will only print the single value that satisfied this generator 

Benzer ya next veya extend kullanırsanız

for number in code: 
    coded_message.append([letter for letter, value in alphabet_dictionary.items() if value == number]) 

coded_message 
## [["a"], ["b"],... ] - not the right order, of course, but now you have a list of lists, which is probably not what you want. 

, bir listede alırsınız: .append() içindeki liste anlama, bu daha kolay sorunu gösterebiliriz Muhtemelen istediğin mektuplar.

Yine de, eğer eşlemeyi tersine çevirmek istiyorsanız, ters eşlemeyi bir sözlük olarak da yapıyorum. Örneğin, "a" = 0 eşlemenizi oluşturduğunuzda, 0 = "a" ile bir sözlük de yapın. Bu daha hızlı bir görünüm-up için (gerçi bir alfabe ölçekli listede, muhtemelen fark asla birlikte) olacaktır ve siz gibi

for letter, number in alphabet_dict.items(): 
    if number_dict[number] != letter: 
     raise "Something got confused: got {}->{}->{}".format(letter, number, number_dict[number]) 
0
import string 
#this builds a similar dictionary to yours: 
alphabet_dictionary = {a:ord(a)-ord('a') for a in string.ascii_lowercase} 

Sen map kullanabilirsiniz, aklı kontrol yapalım olacaktır: (http://stackoverflow.com/questions/25 -

#invert the dictionary, in your case it's easy because it's 1-to-1: 
decode_dictionary = {v:k for k,v in alphabet_dictionary.items()} 
decoded_message = map(decode_dictionary.__getitem__, coded_message) 
[Python Ters sözlük arama] arasında
İlgili konular