【问题标题】:How to build a dict of indices of occurences of elements in a list in Python?python - 如何在Python列表中构建元素出现索引的字典?
【发布时间】:2014-04-02 15:00:39
【问题描述】:

将列表中所有元素的出现索引转换为字典的最快方法是什么?

例如:

A = [ 1, 2, 3, 4 , 2, 1 ]

我想建造:

B['1'] = [0, 5]
B['2'] = [1, 4]
B['3'] = [2]
B['4'] = [3]

这是为了避免在循环中多次调用np.where,这对于大型A 来说太慢了。理想情况下,只想遍历数组A 一次。 比如想避免:

uniqA = np.unique(A)
for i in uniqA:
    B[str(i)] = np.argwhere(i==A)

【问题讨论】:

  • 为什么你希望键是字符串?
  • 不需要它们是字符串。键也可以是整数

标签: python numpy


【解决方案1】:

你只能迭代一次:

>>> from collections import defaultdict
>>> A = [ 1, 2, 3, 4 , 2, 1 ]
>>> d = defaultdict(list)
>>> for i,x in enumerate(A):
...    d[x].append(i)
...
>>> d
defaultdict(<type 'list'>, {1: [0, 5], 2: [1, 4], 3: [2], 4: [3]})

【讨论】:

    【解决方案2】:

    这样的事情应该可以工作。

    from collections import defaultdict
    d = defaultdict(list)
    for i, val in enumerate(A):
        d[val].append(i)
    

    【讨论】:

      【解决方案3】:

      我认为不需要defaultdict——不确定这是否比这种方法更好?

      B={}
      for i,x in enumerate(A):
          B[x]=B.get(x,[]) + [i]
      

      结果:

      {1: [0, 5], 2: [1, 4], 3: [2], 4: [3]}
      

      【讨论】:

      • 您在每次迭代中创建一个新列表并重新分配B[x] 给它(对于大量数据而言,效率低下可能很重要)。在这种情况下,附加到 B.get(x,[]) 的返回值更有意义,它会就地修改它。
      • 有趣。虽然如果您尝试附加到 []... (=NoneType) 会出现错误,但我只想尽可能避免使用 import。
      • 这与附加到[] 没有任何关系,它的类型是list。您可能将append() 调用的返回值分配给B[x]。在 Python 中,按照惯例,像 append() 这样的副作用函数会返回 None。您必须将get() 返回的对象分配给B[x],并在不同的语句中附加到它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      相关资源
      最近更新 更多