Получить индексы символа в строке в Python - PullRequest
0 голосов
/ 05 октября 2018

Проблема, которую я пытаюсь решить, такова: у меня есть строка, скажем, "abcabcdefdefjhi".Я хочу, чтобы результатом был числовой вывод, подобный следующему:

a: 0, 3
b: 1, 4
c: 2, 5
.
.
.

PS Строка написана на арабском языке, но все же полезно знать, как это сделать как для арабского, так и для английского.

Ответы [ 5 ]

0 голосов
/ 06 октября 2018

Использование defaultdict из коллекций

from collections import defaultdict

s = 'abcabcdefdefjhi' 
dd = defaultdict(list)

for i, v in enumerate(s):
    dd[v].append(i)

for k, v in dd.items():
    print('{}: {}'.format(k, ', '.join(list(map(str,v)))))
a: 0, 3
b: 1, 4
c: 2, 5
d: 6, 9
e: 7, 10
f: 8, 11
j: 12
h: 13
i: 14
0 голосов
/ 05 октября 2018

В строке:

c = "abcabcdefdefjhi"
print "\n".join(["%s: %s" %( e, ", ".join([ str(j) for j, e2 in enumerate(c) if e2==e]) ) for i, e in enumerate(sorted(set(c)))])

1) Список неповторяющихся:

sorted(set(c))

['a', 'b', 'c', 'd',' e ',' f ',' h ',' i ',' j ']

2) Список позиций по буквам

[ (i, e) for i, e in enumerate(sorted(set(c)))]

[(0, «a»), (1, «b»), (2, «c»), (3, «d»), ..., (6, «h»), (7, «i»'), (8,' j ')]

3) Группировка позиций по буквам:

[( e, [ j for j, e2 in enumerate(c) if e2==e] ) for i, e in enumerate(sorted(set(c)))]

[(' a ', [0, 3]), ('b', [1, 4]), ('c', [2, 5]), ..., ('i', [14]), ('j', [12])]

4) Сокращается в одну строку

print "\n".join(["%s: %s" %( e, ", ".join([ str(j) for j, e2 in enumerate(c) if e2==e]) ) for i, e in enumerate(sorted(set(c)))])

a: 0, 3

b: 1, 4

c: 2, 5

д: 6, 9

е: 7, 10

f: 8, 11

ч: 13

i: 14

j: 12

0 голосов
/ 05 октября 2018

Может пригодиться словарь списков, отображающий буквы в список индексов:

s = "abcabcdefdefjhi"
indices = {}

for i, l in enumerate(s):
    if l not in indices:
        indices[l] = []

    indices[l].append(i)

for k, v in indices.items():
    print("{}: {}".format(k, str(v)[1:-1]))

Вывод:

a: 0, 3
b: 1, 4
c: 2, 5
d: 6, 9
e: 7, 10
f: 8, 11
j: 12
h: 13
i: 14

Или тестирование с помощью "لوحة المفاتيح ال":

ل: 0, 6, 15
و: 1
ح: 2, 12
ة: 3
 : 4, 13
ا: 5, 9, 14
م: 7
ف: 8
ت: 10
ي: 11

Попробуйте .

0 голосов
/ 05 октября 2018

Легко попробуйте это:

 for index,i  in enumerate(s,0):
     print index, ':',i

Вывод:

0 голосов
/ 05 октября 2018

Используйте перечисление, как это:

def findOccurrences(s, ch):
    return [i for i, letter in enumerate(s) if letter == ch]


print(findOccurrences('abcabcdefdefjhi', 'a'))

Вывод:

[0, 3]
...