首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用if-statement进行Python字典理解,但if-statement包含字典本身

使用if-statement进行Python字典理解,但if-statement包含字典本身
EN

Stack Overflow用户
提问于 2017-07-12 13:29:00
回答 2查看 526关注 0票数 0

我想为一个字母串创建一个字典,它的键是唯一的字母,值是字母第一次出现的索引。例如: word = 'mississippi',正确答案应为{'m':0,'i':1,'s':2,'p':8}

我试着写“pythonic”代码:

代码语言:javascript
复制
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循环做了正确的事情:

代码语言:javascript
复制
for i in range(len(word)):

    if word[i] not in first_apperance_dict.keys():

        dict[word[i]]=i

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

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

EN

回答 2

Stack Overflow用户

发布于 2017-07-12 13:35:41

您不能使用理解来引用它正在创建的字典,因为只有在理解完成之后才会创建字典。

一般来说,你不能使用理解来做你在这里正在做的事情。在理解中,每个值应该只依赖于迭代中的一个值。但在您的计算中,每个值都依赖于所有先前值的结果(通过它们对正在创建的字典的影响)。

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

代码语言:javascript
复制
>>> {char: word.index(char) for char in word}
{'i': 1, 'm': 0, 'p': 8, 's': 2}

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

代码语言:javascript
复制
>>> {char: word.index(char) for char in set(word)}
{'i': 1, 'm': 0, 'p': 8, 's': 2}

这只对单词中的唯一字符进行迭代,而不是对所有字符进行迭代。

票数 4
EN

Stack Overflow用户

发布于 2017-07-12 13:57:58

@BrenBarn已经给出了一个很好的解释。我只是向您展示如何使用find()方法。此方法返回给定stringchar的第一个匹配项索引。

代码语言:javascript
复制
>>> word = 'mississippi'
>>> {w:word.find(w) for w in set(word)}
{'i': 1, 'p': 8, 's': 2, 'm': 0}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45049101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档