【问题标题】:Python list and dictionary comprehensionPython列表和字典理解
【发布时间】:2021-03-12 17:59:29
【问题描述】:

我正在尝试习惯于列出字典的理解。这里有一个小代码我一直无法转换。

lst = ['C', 'A', 'B', 'A']
myd = {}
for v, k in enumerate(lst):
    if k in myd:
        myd[k].append(v)
    else:
        myd[k] = [v]

print(myd)

>>> {'C': [0], 'A': [1, 3], 'B': [2]}

我很乐意得到一些帮助。

【问题讨论】:

  • 嗯,你不能适应字典的理解,因为它非常易读
  • 你想要的输出到底是什么?
  • 期望的输出:{'C': [0], 'A': [1, 3], 'B': [2]}

标签: python list-comprehension dictionary-comprehension


【解决方案1】:

这是答案,尽管我认为非理解方法更容易理解。如前所述,这至少效率不高。

我会坚持你所拥有的。

{k:[i for i, j in enumerate(lst) if j == k] for k in set(lst)}

【讨论】:

  • 这很糟糕,这个 O(n^2) 并且循环版本可能更难阅读
  • 是的,太可怕了。
  • 更重要的是,这是二次时间与线性时间朴素方法
  • 比这更好的只是排序和使用 itertools.groupby ....
  • 我只是想提高对理解的理解。干得好克里斯,谢谢
【解决方案2】:

一个带有辅助字典的 hack,但至少是线性时间。

>>> {k: d.setdefault(k, []).append(i) or d[k]
     for d in [{}]
     for i, k in enumerate(lst)}
{'C': [0], 'A': [1, 3], 'B': [2]}

变体:

>>> {k: d.setdefault(k, [i])
     for d in [{}]
     for i, k in enumerate(lst)
     if k not in d or d[k].append(i)}
{'C': [0], 'A': [1, 3], 'B': [2]}

【讨论】:

  • 谢谢,也是一个不错的解决方案,也许更容易理解
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 2018-03-18
  • 2020-10-18
相关资源
最近更新 更多