例如,给定:
['A', 'B', 'A', 'B']
我希望:
{'A': [0, 2], 'B': [1, 3]}
我尝试了一个类似的循环;添加找到字符的索引,然后将其替换为''
,以便下次循环通过时,它会传递给下一个字符。
然而,由于其他原因,这些循环不起作用,我不知道如何继续。
答案 0 :(得分:9)
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)])