更改字符串以避免系统地重复?

时间:2019-02-28 20:00:31

标签: python

按如下所示获取列表Usernames

Usernames = ["johnsmith"]

我有变量NewUsername,我需要检查其值是否已包含在列表中。如果不是,则将整数连接到其末尾。

示例:

NewUsername = "alexsmith"
Usernames = ["johnsmith", "alexsmith"]

NewUsername = "johnsmith"
Usernames = ["johnsmith", "alexsmith", "johnsmith1"]

NewUsername = "johnsmith"
Usernames = ["johnsmith", "alexsmith", "johnsmith1", "johnsmith2"]

现在,我知道我可以使用类似的方法来做到这一点,但它只会检查重复名称的第一个“级别”。

if NewUsername in Usernames:
    NewUsername = NewUsername + "1"
Usernames.append(NewUsername)

问题:我如何以类似方式处理所有重复项?

1 个答案:

答案 0 :(得分:0)

也许有点复杂,但是您可以使用列表的自定义子类。给您一个想法:

from collections import Counter

class UsernameList(list):
    def __init__(self, *args):
        super(UsernameList, self).__init__()
        self._ucount = Counter()
        for e in args[0]:
            self.append(e)

    def append(self, el):
        if isinstance(el, str):            
            if self._ucount[el] == 0:
                super(UsernameList, self).append(el)
            else:
                fixel = el + str(self._ucount[el])
                super(UsernameList, self).append(fixel)
                self._ucount.update([fixel])
            self._ucount.update([el])
        else:
            raise TypeError("Only string can be appended")

现在您可以:

Usernames = UsernameList(["johnsmith"]) #Username is ["johnsmith"]
Usernames.append("johnsmith") #Username becomes ["johnsmith", "johnsmith1"]
Usernames.append("johnsmith") #Username becomes ["johnsmith", "johnsmith1", "johnsmith2"]

除了新的__init__append方法之外,UsernameList具有列表的所有方法,并且完全像列表一样工作。不用担心counter属性,它可以跟踪输入的用户名并在重复的情况下添加正确的数字。
为了使内容更一致,您可能需要覆盖其他方法:我只是给您一个想法,而不是在此处编写完整的工作代码。
您可以查看the docs,以获取有关可能需要覆盖哪些方法的更多详细信息。