使用ifstatement理解Python字典,但ifstatement包含字典

2024-04-19 07:29:48 发布

您现在位置:Python中文网/ 问答频道 /正文

字母的索引是唯一的,字母在字典中首先出现。例如:word='missippi',正确答案应该是{'m':0,'i':1,'s':2,'p':8}

我试着写“Python”代码:

dict = {word[i]:i  for i in range(len(word))  if word[i] not in dict.keys()}

然而,我得到的是:{'I':10,'m':0,'p':9,'s':6}, 这就好像dict没有更新,并且在调用if语句时仍然是空的。在

一个普通的for循环做了正确的事情:

^{pr2}$

输出:{'i':1,'m':0,'p':8,'s':2}

那为什么呢?对于这个问题,是否有一个python优雅的代码?一般来说,在列表/字典理解中,我应该只把“静态”变量放在if语句中吗?在


Tags: 答案代码inforlenif字典字母
2条回答

@BrenBarn已经给出了一个很好的解释。我只演示使用find()方法。此方法从给定的string返回char的第一个出现索引。在

>>> word = 'mississippi'
>>> {w:word.find(w) for w in set(word)}
{'i': 1, 'p': 8, 's': 2, 'm': 0}

你不能用理解来引用它正在创建的dict,因为dict是在理解完成之后才创建的。在

一般来说,你做不到这种理解。在理解中,每个值应该只依赖于迭代中的一个值。但在计算中,每个值都取决于之前所有值的结果(通过它们对创建的dict的影响)。在

对于您的具体示例,有一种更简单的方法,因为您想要的结果实际上并不依赖于以前的值。您只需要单词中每个字符的第一次出现,这可以直接执行:

>>> {char: word.index(char) for char in word}
{'i': 1, 'm': 0, 'p': 8, 's': 2}

在这个版本中,稍后出现的字符“覆盖”以前的值,但它们用相同的值覆盖,因此没有效果。更好的版本是:

^{pr2}$

它只迭代单词中唯一的字符,而不是所有字符。在

相关问题 更多 >