查找2个字符串中的唯一字符

时间:2019-10-06 18:04:41

标签: python

我正在编写python代码以查找2个字符串中的常见字符。 以下是代码:

class CharactersInString:
    def __init__(self, value1, value2):
        self.value1 = value1
        self.value2 = value2

    def find_chars_order_n(self):
        new_string = [ ]
        new_string1 = " "
        new_value1 = list(self.value1)
        new_value2 = list(self.value2)
        print( "new_value1: ", new_value1)
        print( "new_value2: ", new_value2)
        for i in new_value1:
            if i in new_value2:
                new_string.append(i)
        print(new_string)
        new_list = set(new_string)
        final_list = list(new_list)
        print(final_list)
        print(''.join(final_list))

if __name__ == "__main__":
     obj = CharactersInString("hello manzer", "helzo killmse")
     print(obj.find_chars_order_n())

所需的输出为helo mz。上面的代码为我提供了elzohm的输出。我想获得唯一的字符,而且,字符的顺序应按照value1进行维护。使用SET不提供有序集合。我是python的新手。您能否帮助我如何获得所需的输出并保持字符串的顺序

3 个答案:

答案 0 :(得分:1)

您可以添加条件,以在附加字母之前查看列表中是否存在字母。

尝试以下代码:

class CharactersInString:
    def __init__(self, value1, value2):
        self.value1 = value1
        self.value2 = value2

    def find_chars_order_n(self):
        new_string = []
        # new_value1 = list(self.value1)
        # new_value2 = list(self.value2)
        # print( "new_value1: ", new_value1)
        # print( "new_value2: ", new_value2)
        for i in self.value1:
            if i in self.value2 and i not in new_string:
                new_string.append(i)
        # print(new_string)
        # new_list = set(new_string)
        final_list = list(new_string)
        # print(final_list)
        return ''.join(final_list)

if __name__ == "__main__":
     obj = CharactersInString("hello manzer", "helzo killmse")
     print(obj.find_chars_order_n())

输出:

helo mz

由于我们要遍历value1,因此我们确定顺序将根据value1。另外,我们根本不会通过使用i not in new_string进行检查来添加重复的值,因此它最好比“追加”然后使用集合删除。

答案 1 :(得分:0)

由于dict键从Python 3.7开始遵循其插入顺序,因此您可以使用从dict.fromkeys方法创建的键来有效地创建value1的有序集合,以便随后可以迭代此有序键设置为测试每个字符是否在value2中,可以将其首先转换为集合,以用于 O(1)查找时间复杂度,从而导致整体时间复杂度为 O( n)

def CharactersInString(value1, value2):
    set2 = set(value2)
    return ''.join(c for c in dict.fromkeys(value1) if c in set2)

这样:

CharactersInString("hello manzer", "helzo killmse")

返回:'helo mze'

或者如果您不介意使用dunder方法set.__contains__来测试成员资格:

def CharactersInString(value1, value2):
    return ''.join(filter(set(value2).__contains__, dict.fromkeys(value1)))

请注意,如果您使用的是旧版本的Python,则可以在collections.OrderedDict处使用dict

答案 2 :(得分:0)

  

此外,应按值1保持字符顺序。使用SET不能提供有序的集合。

您可以通过重新设置设置内容来编写更简单的代码:

def unique_in_order_of_first(first, second):
    unique = set(first).intersection(second)
    return ''.join(sorted(unique, key=first.index))