使用if语句的Python字典理解,但if语句包含字典本身

时间:2017-07-12 05:29:00

标签: python dictionary if-statement syntax

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

我试着写“pythonic'代码:

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

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

正常的循环做了正确的事情:

for i in range(len(word)):

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

        dict[word[i]]=i

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

那么,为什么呢?这个问题有一个pythonic优雅的代码吗?一般来说,我应该只放置静态" list / dictionary comprehensions中if语句中的变量?

2 个答案:

答案 0 :(得分:3)

你无法使用理解来引用它正在创建的词典,因为直到理解完成之后才会创建词典。

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

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

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

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

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

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

答案 1 :(得分:0)

@BrenBarn已经给出了一个很好的解释。我只是使用int LocationY = ListBox.PreferredHeight / ListBox.Items.Count * (Index/*ListBox index*/ - ListBox.TopIndex); if ((LocationY + image.Height) > Listbox.Height) LocationY = ListBox.Height - image.Height; e.Graphics.DrawImage(image, new Rectangle(0, LocationY, iWidth, iHeight), 0, 0, iWidth, iHeight, GraphicsUnit.Pixel, attr); 方法向您展示。此方法从给定的find()返回char的第一个匹配索引。

string