【问题标题】:Python dictionary comprehension with if-statement, but the if-statement contains the dictionary itself带有 if 语句的 Python 字典理解,但 if 语句包含字典本身
【发布时间】:2017-07-12 05:28:59
【问题描述】:

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

我尝试编写“pythonic”代码:

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 循环做了正确的事:

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 语句中吗?

【问题讨论】:

    标签: python dictionary if-statement syntax


    【解决方案1】:

    您不能使用推导来引用它正在创建的字典,因为直到推导完成后才会创建字典。

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

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

    >>> {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}
    

    这只会遍历单词中的唯一个字符,而不是所有字符。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-06
        • 2013-04-02
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 2021-11-15
        • 2021-07-12
        相关资源
        最近更新 更多