这是我的代码。正如你所看到的,如果元素不在列表中,我会将每个元素附加到列表中,但我注意到我仍然以某种方式获得重复的元素。
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调试器控制台中获取屏幕截图,以显示该元素实际上是相同的。
为什么会发生这种情况,我该如何解决?
答案 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的启发。
由于您的extraData
是list
,因此对此解决方案不应有任何重大的性能损失。