不在列表中仍然给我重复的元素

时间:2016-05-29 12:26:31

标签: python list

这是我的代码。正如你所看到的,如果元素不在列表中,我会将每个元素附加到列表中,但我注意到我仍然以某种方式获得重复的元素。

def getExtraData(table):
    extraData = list()
    for ele in table:
        extras = re.findall('\[(.+?)\]', str(ele[0]))
        for extra in extras:
            single = extra.split(", ")
            for s in single:
                if s not in extraData:
                    extraData.append(s)
    return extraData

在pycharm调试器控制台中获取屏幕截图,以显示该元素实际上是相同的。

enter image description here

为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:2)

  

为什么会发生这种情况,我该如何解决?

没有什么可以解决的,一切都很好。你得到" Box S et"和" Box s et"因为这些是不同的字符串。如果您想要不区分大小写,请存储小写版本,并测试小写,例如

if s.lower() not in extraData:
  extraData.append(s.lower())

此外,为什么要使用列表呢?这应该只是一个集合(将in的计算复杂度从O(N)降低到接近O(1)

def getExtraData(table):
    extraData = set()
    for ele in table:
        extras = re.findall('\[(.+?)\]', str(ele[0]))
        for extra in extras:
            single = extra.split(", ")
            for s in single:
                extraData.add(s.lower())
    return list(extraData)

甚至更短(因为我们省略了python循环,但稍快一点)

def getExtraData(table):
    extraData = set()
    for ele in table:
        extras = re.findall('\[(.+?)\]', str(ele[0]))
        for extra in extras:
            extraData.update(map(str.lower, extra.split(", ")))
    return list(extraData)

答案 1 :(得分:1)

除了lejlot之外,如果要在extraData中存储字符串时保留字符串的大小写,则可以使用生成器作为检查部分:

if s.lower() not in map(str.lower, extraData):
  extraData.append(s)

Case insensitive 'in' - Python的启发。

由于您的extraDatalist,因此对此解决方案不应有任何重大的性能损失。