我正在编写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的新手。您能否帮助我如何获得所需的输出并保持字符串的顺序
答案 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))