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]
答案 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)
执行)来生成密钥,并获取每个唯一元素的索引(列表理解确实)。