Использование локальной переменной из цикла for в качестве имени для словарного ключа перезаписывает предыдущий ключ - PullRequest
0 голосов
/ 14 октября 2019

Когда я пытаюсь добавить значение, используя i+1, в свой словарь в качестве имени в цикле my, он заменяет предыдущий ключ, даже если они технически имеют отдельное имя. В настоящее время я пытаюсь создать систему шифрования, и для этого я должен произвольно сгенерировать ключевое слово, а затем превратить это ключевое слово в список, разделяющий каждого отдельного символа. Это прекрасно работает, в любом случае я использую словари, чтобы попытаться сделать мягко закодированные переменные в определенной степени. Я хочу переменную для каждого символа, чтобы на них можно было ссылаться позже, вместо того, чтобы множество переменных было просто перезаписано с нуля. Позвольте мне показать вам код, который у меня есть.

import urllib.request
import random

word_url = "http://svnweb.freebsd.org/csrg/share/dict/words?view=co&content-type=text/plain"
response = urllib.request.urlopen(word_url)
long_txt = response.read().decode()
words = long_txt.splitlines()
keyword = random.choice(words)

def split(word):
    return list(word)
def getLetters(word):
    localvar1 = list(word)
    localvar2 = len(localvar1)
    for i in range(localvar2):
        global letters
        letters = {}
        letters[i+1] = localvar1[i].copy()
        print(letters)
def printLetters():
    for i in range(len(letters)):
        try:
            print(letters[1+i])
        except:
            ValueError

Вот и весь код, код, специально предназначенный для создания словаря.

def getLetters(word):
    localvar1 = list(word)
    localvar2 = len(localvar1)
    for i in range(localvar2):
        global letters
        letters = {}
        letters[i+1] = localvar1[i].copy()
        print(letters)

Я думаю, проблема в том, чтоон распознает i+1 как единственное имя, хотя каждый раз, когда цикл for, цикл i увеличивается в значении. Я перепробовал все, что мог придумать, и это мое последнее средство. Я практически просмотрел каждую онлайн-статью, которую мог бы исправить, хотя я мог что-то пропустить. Я пытался использовать __setitem__ для создания новых списков из этого списка и кучу других вещей, которые я не могу вспомнить. Я работал над этим часами, и теперь у меня просто болит голова, любая помощь будет признательна.

1 Ответ

2 голосов
/ 14 октября 2019

она перезаписывает переменную, потому что вы переопределяете ее в своем цикле как пустой словарь, а затем помещаете в нее только одно значение. Переместите эти 2 строки за пределы цикла, и это исправлено. Также вам не нужно использовать эти локальные переменные, просто используйте перечисление.

def getLetters(word):
    global letters
    letters = {}
    for i, letter in enumerate(word, 1):
        letters[i] = letter
    print(letters)

Это печатает:

{1: 'W', 2: 'h', 3: 'i', 4: 't', 5: 'c', 6: 'o', 7: 'm', 8: 'b'}

Примечание Я не совсем оправдываюэто потому, что это очень нетрадиционно делать это. Почему бы просто не вернуть словарь и при его вызове присвоить результат переменной, то теперь это глобальное значение в этом контексте. Также простое понимание диктовок будет делать именно то, что вы пытаетесь сделать:

def getLetters(word):
    return {i:l for i, l in enumerate(word, 1)}

letters = getLetters(keyword)

Edit или, как умно упомянуто @furas, просто используйте:

return dict(enumerate(word, 1))

Все это говорит, что я не верю, что вам даже действительно нужна эта функция. Чтобы получить вторую букву в этом диктовке, вы использовали бы letters[2], тогда как если бы оно было просто оставлено как строковое значение, его можно было бы обработать аналогично списку, так что keyword[1] было бы таким же результатом, или просто используйте keyword[i+1], еслипервый индекс должен начинаться с 1.

...