创建一个字典,列表项作为键,索引作为值?

时间:2016-12-13 03:04:37

标签: python dictionary

s =['Hello','World','Hello','World']
l = list()
for x,y in enumerate(s):
    l.append((y,x))

我得到的输出是[('Hello', 0), ('World', 1), ('Hello', 2), ('World', 3)]

但我想要

Hello-[0,2]
World-[1,3]

4 个答案:

答案 0 :(得分:3)

您可以使用字典:

d = {}
for i, v in enumerate(s):
    if v in d:
        d[v].append(i)
    else:
        d[v] = [i]

d
# {'Hello': [0, 2], 'World': [1, 3]}

答案 1 :(得分:3)

似乎collections.defaultdict非常适合这种情况(另见@mhawke的答案):

from collections import defaultdict

dd = defaultdict(list)
for idx, item in enumerate(s):
    dd[item].append(idx)

然后再将其转换为普通字典:

>>> dict(dd)
{'Hello': [0, 2], 'World': [1, 3]}

我最近创建了一个包含一个可以用作替代iteration_utilities.groupedby的函数的包:

>>> from iteration_utilities import groupedby
>>> from operator import itemgetter
>>> s =['Hello','World','Hello','World']
>>> groupedby(enumerate(s), key=itemgetter(1), keep=itemgetter(0))
{'Hello': [0, 2], 'World': [1, 3]}

答案 2 :(得分:2)

使用collections.defaultdict个列表:

from collections import defaultdict

d = defaultdict(list)
s = ['Hello','World','Hello','World']
for index, key in enumerate(s):
    d[key].append(index)

>>> print(d)
defaultdict(<type 'list'>, {'World': [1, 3], 'Hello': [0, 2]})
>>> print(dict(d))    # convert to a std dictionary
{'World': [1, 3], 'Hello': [0, 2]}

答案 3 :(得分:2)

这也可以使用相当简单的字典理解来完成:

>>> s =['Hello','World','Hello','World']
>>> d = {k: [pos for pos, el in enumerate(s) if el == k] for k in set(s)}
>>> d
{'World': [1, 3], 'Hello': [0, 2]}
>>> 

这可以通过使用列表s中的每个唯一元素(set(s)执行)来生成密钥,并获取每个唯一元素的索引(列表理解确实)。