如何在dict中添加索引

时间:2016-04-04 05:29:37

标签: python list dictionary indexing list-comprehension

例如,给定:

['A', 'B', 'A', 'B']    

我希望:

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

我尝试了一个类似的循环;添加找到字符的索引,然后将其替换为'',以便下次循环通过时,它会传递给下一个字符。

然而,由于其他原因,这些循环不起作用,我不知道如何继续。

4 个答案:

答案 0 :(得分:9)

使用enumeratesetdefault

example = ['a', 'b', 'a', 'b']
mydict = {}
for idx, item in enumerate(example):
     indexes = mydict.setdefault(item, [])
     indexes.append(idx)

答案 1 :(得分:3)

简单的字典理解应该可以解决问题:

{key: [index for index, x in enumerate(my_list) if x == key] for key in my_list}

一个简单的试验:

>>>> my_list = ['A','B','A','B']
>>>> {key: [index for index, x in enumerate(my_list) if x == key] for key in my_list}
>>>> {'A': [0, 2], 'B': [1, 3]}

如何运作

List comprehensions经常在Python中用作for循环的语法糖。而不是写

my_list = []
for item in range(10):
    my_list.append(item)

list comprehensions基本上允许您将这一系列语句压缩成一行:

my_list = [item for item in range(10)]

每当你看到列表理解时,你应该记住它只是原始三行语句的精简版本。它们实际上完全相同 - 这里提供的唯一好处是简洁。

类似的相关物种是dictionary comprehension。它类似于列表推导,除了它允许您同时指定两个键和值。

词典理解的一个例子:

{k: None for k in ["Hello", "Adele"]}
>>>> {"Hello": None, "Adele": None}

在我提供的答案中,我只是使用字典理解

  • key
  • 中提取my_list s
  • key中的每个my_list指定一个索引列表作为相应的值

从语法上讲,它扩展为一个相当复杂的程序,如下所示:

my_dict = {}
for key in my_list:
    indices = []
    for index,value in enumerate(my_list):
         if value == key:
              indices.append(index)
    my_dict[key] = indices

这里,enumerate是一个返回元组列表的标准库函数。每个元组的第一个元素引用列表的索引,第二个元素引用列表中该索引的值。

观察:

 enumerate(['a','b','a','b'])
 >>>> [(0,'a'),(1,'b'),(2,'b'),(3,'b')]

这是enumerate的力量。

效率

与往常一样,过早优化是万恶之源。确实,这种实现效率很低:它重复工作,并以二次方运行。然而,重要的是询问你所拥有的特定任务是否。对于相对较小的列表,这就足够了。

您可以查看某些优化措施。 @ wilinx的方式运作良好。评论中的@Rob建议迭代set(my_list),这可以防止重复工作。

答案 2 :(得分:3)

为什么不使用itertools中的defaultdict代替:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> 
>>> for i,x in enumerate(l):
        d[x].append(i)


>>> d
defaultdict(<class 'list'>, {'A': [0, 2], 'B': [1, 3]})

答案 3 :(得分:-1)

您需要做的就是使用正确的 DataType 。检查此链接 - python doc。祝好运。希望这会有所帮助。

来源:https://docs.python.org/2/library/collections.html#collections.OrderedDict

>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])