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]
5
Anshul Gupta 13 Дек 2016 в 06:04

4 ответа

Лучший ответ

Вы можете использовать словарь:

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]}
3
Psidom 13 Дек 2016 в 03:07

Это также можно сделать, используя довольно простое понимание словаря:

>>> 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)) и получения индекса каждого из уникальных элементов (что делает понимание списка) ) .

2
Christian Dean 13 Дек 2016 в 03:38

Используйте 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]}
2
mhawke 13 Дек 2016 в 03:12

Похоже, что collections.defaultdict идеально подходит для этого case (см. также ответ @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]}

Недавно я создал пакет, содержащий функцию, которую можно использовать в качестве альтернативы {{ X0 } } :

>>> 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]}
3
MSeifert 4 Апр 2017 в 19:53