Python - пересекающиеся строки - PullRequest
6 голосов
/ 16 марта 2012

Попытка написать функцию for, которая принимает две строки и возвращает символы, которые пересекаются в порядке их появления в первой строке.

Вот что я попробовал:

def strIntersection(str1, str2):
    for i in str1:
        str3 = ''
        str3 = str3.join(i for i in str1 if i in str2 not in str3)
    return str3

str1 = 'asdfasdfasfd'
str2 = 'qazwsxedc'

strIntersection(str1,str2)

=> 'asdasdasd'

однако я хочу, чтобы символы пересечения появлялись только один раз и в порядке первой строки, т.е. 'ASD'

Может кто-нибудь помочь?

Я обнаружил некоторые похожие проблемы на других форумах, но все решения, похоже, включают списки, тогда как я хотел бы, чтобы мой вывод был строкой

Ответы [ 6 ]

7 голосов
/ 16 марта 2012

Требуется строка, состоящая из уникальных символов, общих для str1 и str2, в порядке их появления в str1.

Уникальность и общность подразумевают операции над множествами:мы ищем набор символов, которые появляются как в str1, так и в str2.Набор принципиально неупорядочен, но мы можем переупорядочить данные, отсортировав символы в соответствии с их «индексом» первого появления в str1.Тогда просто создать строку из отсортированной последовательности.

Собрав все вместе, мы получим:

''.join(sorted(set(str1) & set(str2), key = str1.index))
6 голосов
/ 16 марта 2012

Проверьте наличие в обратном порядке, чтобы получить контроль над заказом, и не отправляйте символы, которые вы уже отправили:

def strIntersection(s1, s2):
  out = ""
  for c in s1:
    if c in s2 and not c in out:
      out += c
  return out

Конечно, вы могли бы переписать это, чтобы составить список, но мне легче это понять.

Для ваших тестовых данных мы получаем:

>>> strIntersection('asdfasdfasfd' , 'qazwsxedc')
'asd'
5 голосов
/ 16 марта 2012

Вы можете использовать наборы Python http://docs.python.org/library/stdtypes.html#set для этого, например:

>>> set("asdfasdfasfd") & set("qazwsxedc")
set(['a', 's', 'd'])
2 голосов
/ 16 июня 2016

проще всего использовать наборы в python

>>> a='asdfasdfasfd'
>>> b='qazwsxedc'
>>> set(a).intersection(b)
set(['a', 's', 'd'])
0 голосов
/ 16 марта 2012
def str_intersection(str1, str2):
    common_letters = set(str1) & set(str2)
    str3 = ''
    for c in str1:
        if (c in common_letters) and (c not in str3):
            str3 += c
    return str3
0 голосов
/ 16 марта 2012

Похоже, ваш текущий скрипт должен это делать, если вы исправите опечатку в четвертой строке:

str3 = str3.join(i for i in str1 if i in str2 not in str3)

должно быть

str3 = str3.join(i for i in str1 if i in str2 and i not in str3)

Я бы не рекомендовал использовать этот набор для простоты, потому что они не гарантируют порядок. Ваш сценарий также, вероятно, будет быстрее.

...