Python - Intersectiing strings

◇◆丶佛笑我妖孽 提交于 2019-12-19 18:29:11

问题


Trying to write a for function that takes two strings and returns the characters that intersect in the order that they appear in the first string.

Here's what I tried:

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'

however I only want the the intersection characters to appear once and in order of the first string ie. 'asd'

Can anyone help?

I've found some similar problems on other forums but the solutions all seem to involve lists whereas I'd like my output to be a string


回答1:


Check for occurances the other way around to get the order under control, and don't emit characters you've already emitted:

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

Sure you could re-write it to be a list comprehension, but I find this easier to understand.

For your test data, we get:

>>> strIntersection('asdfasdfasfd' , 'qazwsxedc')
'asd'



回答2:


You want a string consisting of the unique characters that are common to str1 and str2, in the order they appear in str1.

Uniqueness and commonality imply set operations: that is, we're looking for the set of characters that appear in both str1 and str2. A set is fundamentally unordered, but we can re-order the data by sorting the characters according to their "index" of first occurrence in str1. Then it's a simple matter of creating a string from the sorted sequence.

Putting it all together, we get:

''.join(sorted(set(str1) & set(str2), key = str1.index))



回答3:


You can use python sets http://docs.python.org/library/stdtypes.html#set to do this, like so:

>>> set("asdfasdfasfd") & set("qazwsxedc")
set(['a', 's', 'd'])



回答4:


easiest is to use sets in python

>>> a='asdfasdfasfd'
>>> b='qazwsxedc'
>>> set(a).intersection(b)
set(['a', 's', 'd'])



回答5:


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



回答6:


It looks like your current script should do it if you fix the typo on the fourth line:

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

should be

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

I wouldn't recommend using a set for this simpy because they don't guarantee order. Your script is also likely to be faster.



来源:https://stackoverflow.com/questions/9736530/python-intersectiing-strings

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!