【问题标题】:Python Golf: what's the most concise way of turning this list of lists into a dictionary:Python Golf:将此列表转换为字典的最简洁方法是什么:
【发布时间】:2009-02-10 22:49:02
【问题描述】:

我有一个如下所示的列表:

[['Tom', 'Dick'], ['Harry', 'John', 'Mike'], ['Bob']]

我想把它变成一个字典,其中每个键是一个名称,每个值是一个与其子列表在列表中的位置相对应的数字:

{'Tom': 0, 'Dick': 0, 'Harry': 1, 'John': 1, 'Mike': 1, 'Bob': 2}

我尝试了各种列表推导,但无法让它与嵌套列表一起正常工作。我可以使用嵌套循环,如下所示:

names = [['Tom', 'Dick'], ['Harry', 'John', 'Mike'], ['Bob']]
names_dict = {}
for i, name_sublist in enumerate(names):
    for name in name_sublist:
        names_dict[name] = i

但我怀疑有一种更短、更优雅的方法。

【问题讨论】:

  • 我正确记得嵌套列表推导的方式是从左到右对应于等效嵌套循环中的浅到深。因此,要将循环重写为嵌套理解,首先出现最外层循环,然后是内层循环。希望这有点道理:)
  • 在您的问题中,暗示名称是唯一的。如果不是这样,您得到的答案将给出出现非唯一名称的 LAST 子列表的索引。最好的模式 o' Mice an' Men gang aft aft aft aft aft aft agley - 假设 1:1 关系而不检查是常见原因:-)
  • 将最后一句改为“不检查多对多关系是常见原因”:-)

标签: python code-golf


【解决方案1】:

与 MizardX 的想法相同,但在 Python 3.0 中使用 dict comprehensions: 时更小更漂亮

>>> names = [['Tom', 'Dick'], ['Harry', 'John', 'Mike'], ['Bob']]
>>> names_dict = {name:index for index, lst in enumerate(names) for name in lst}
>>> names_dict
{'Tom': 0, 'Mike': 1, 'Dick': 0, 'Harry': 1, 'Bob': 2, 'John': 1}

【讨论】:

    【解决方案2】:
    names_dict = dict((name,index)
                      for index,lst in enumerate(names)
                      for name in lst)
    

    例子:

    >>> names = [['Tom', 'Dick'], ['Harry', 'John', 'Mike'], ['Bob']]
    >>> names_dict = dict((name,index)
    ...                   for index,lst in enumerate(names)
    ...                   for name in lst)
    >>> names_dict
    {'Tom': 0, 'Mike': 1, 'Dick': 0, 'Harry': 1, 'Bob': 2, 'John': 1}
    

    【讨论】:

      【解决方案3】:

      python 2.6

      dict([(t,l.index(x)) for x in l for t in x])
      

      python3.0

      {t:l.index(x) for x in l for t in x}
      

      如果 l 是名称列表

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-05
        • 2010-12-06
        • 1970-01-01
        • 2014-07-29
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        相关资源
        最近更新 更多