Как найти общие элементы строки, но не в правильном порядке в Python? - PullRequest
1 голос
/ 18 апреля 2020

Предположим, есть две строки:

str1 = "15323"
str2 = "12314"

Как найти индексы чисел в обеих строках, которые не находятся в одном и том же порядке на основе одной из строк? Ожидаемое значение:

[3, 4] # the numbers in str1 that are in str2 but not in the exact place of str2: 2 and 3
"15323"
    ^^
"12314"
  ^^

Еще один пример, поскольку я не могу это объяснить:

str1 = "3546"
str2 = "1346"

Ожидаемое значение:

[0] # only "3" is in str1 AND str2 and it does not have the same index as the "3" in str2

"3546"
"3" in "3546" appears in str2 and it does not have the same index
"5" in "3546" does not appear in str2
"4" in "3546" appears in str1 but has the same index as the "4" in str2
"6" in "3546" appears in str1 but has the same index as the "6" in str2

Я пробовал код, чтобы найти общие элементы в две строки, но я не могу обернуть голову вокруг дубликатов. Я не хотел бы импортировать какие-либо модули, и спасибо заранее.

result = []
for string in str1:
  if string in str2:
    if str1.index(string) != str2.index(string):
      result.append(str1.index(string))

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Для эффективного теста членства вы можете преобразовать str2 в набор и перечислить сжатую последовательность str1 и str2, и выводить только индексы, в которых соответствующие символы не равны, а символы в str1 находится в наборе:

s = set(str2)
[i for i, (a, b) in enumerate(zip(str1, str2)) if a != b and a in s]

, поэтому, если дано:

str1 = "15323"
str2 = "12314"

, выражение будет возвращать:

[3, 4]

, а данное:

str1 = "3546"
str2 = "1346"

будет возвращено:

[0]
1 голос
/ 18 апреля 2020

Используйте enumerate, а не index, чтобы найти индекс. index вернет первое вхождение значения в строке.

Уточненный код

result = []
for idx,i in enumerate(str1):
    if i in str2:
        if str2[idx]!=i:      
            result.append(idx)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...