Получить общие символы из строк

Я ищу способ сравнения двух строк и возможности вернуться в виде отдельных строк:

  • Все общие персонажи,
  • Необычные символы (все символы, кроме обычных)
  • Символы, уникальные для одной строки.

Пример:

A = "123 ABC"
B = "135 AZ"

thingamajigger(A, B)  # would give all these:

intersect = "13 A"  # (includes space)
exclusion = "2BCZ5"
a_minus_b = "2BC"
b_minus_a = "5Z"

a_minus_b довольно просто... но если есть один из этих причудливых однострочных способов осуществить это, то я открыт.

for i in B:
    A = A.replace(i, "")

Это немного похоже на логические операции над строками.


person Jollywatt    schedule 16.07.2013    source источник


Ответы (1)


Используйте set:

s = set("123 ABC")
t = set("135 AZ")
intersect = s & t # or s.intersection(t)
exclusion = s ^ t # or s.symmetric_difference(t)
a_minus_b = s - t # or s.difference(t)
b_minus_a = t - s # or t.difference(s)
person jason    schedule 16.07.2013
comment
Вау... конечно... и тогда вы можете просто использовать .joint(set), чтобы сжать его в строку! Спасибо. - person Jollywatt; 16.07.2013
comment
@Joseph: Это красиво, не правда ли? :-) - person jason; 16.07.2013
comment
Единственное, наборы содержат только уникальные элементы. Итак, скажем, я хотел вычесть ! из Hello!. Использование set(Hello!) - set(!) даст Helo. Но использование альтернативы a_minus_b выше работает. :) - person Jollywatt; 16.07.2013
comment
@Джозеф: понятно. Если это то, что вы хотите, я бы использовал "".join([c for c in A if c not in set(B)]); это намного эффективнее (аддитивное в длинах против мультипликативного в длинах). - person jason; 16.07.2013