python - 使用 for 循环中的局部变量作为字典键的名称会覆盖先前的键
问题描述
当我尝试使用i+1
我的字典添加一个值作为我的 for 循环中的名称时,它会替换前一个键,即使它们在技术上具有单独的名称。我目前正在尝试做的是制作一个加密系统,为了做到这一点,我让它随机生成一个关键字,然后将该关键字放入一个分隔每个单独字符的列表中。这很好用,无论如何我正在使用字典来尝试在一定程度上制作软编码变量。我希望每个字符都有一个变量,以便以后可以引用它们,而不是从零开始覆盖很多变量。让我向您展示我到目前为止的代码。
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__
从该列表和其他一些我不记得的东西创建新列表。我已经为此工作了几个小时,现在我只是头疼,任何帮助将不胜感激。
解决方案
它覆盖了变量,因为您在循环中将其重新定义为空白字典,然后只在其中放入一个值。将这两条线移到循环之外,它是固定的。此外,您不需要使用那些局部变量,只需使用枚举。
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'}
请注意,我并不完全容忍这种做法,因为这样做非常不合常规。为什么不只返回字典并在调用它时将结果分配给一个变量,那么现在它在这个上下文中是一个全局值。一个简单的 dict 理解也将完全符合您的要求:
def getLetters(word):
return {i:l for i, l in enumerate(word, 1)}
letters = getLetters(keyword)
编辑或@furas 如此巧妙地提到,只需使用:
return dict(enumerate(word, 1))
这一切都说我不相信你甚至真的需要这个功能。要获取此 dict 中的第二个字母,您将使用letters[2]
它,而如果它只是作为字符串值保留,则可以将其与列表类似地对待,因此keyword[1]
结果相同,或者仅keyword[i+1]
在您必须让第一个索引从 1 开始时使用.
推荐阅读
- quarkus - 如何在 quarkus 的 microprofile rest 客户端上忽略 ssl
- linux - bash:awk 打印与打印
- python - Antiword 将 .doc 转换为 empy .txt 文件
- c - “警告:左移计数> =类型宽度”似乎发生得太晚了
- c# - 来自内部 Web 的 AppInsights 可达性检查
- r - R - 将列表列表转换为数据框时如何保留数据类型和标题
- r - 在 ggplot2 直方图中添加与 bin 相同高度的选定观测值的标签
- java - jdbcTemplate.query(PreparedStatementCreator psc,ResultSetExtractor
rse) 不返回任何结果集 - reactjs - Redux 对 .then 的操作承诺另一个非常慢
- c - 如何在 glibc 中为特定(新/现有)函数创建别名