2016-05-29 49 views
0

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

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

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

没有什么可以解决的,一切都很好。您可以获得“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) 

甚至有点短(和稍快,因为我们忽略蟒蛇循环)

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

或者到lejlot,如果你想保留字符串的情况下,当它们存储在extraData,你可以使用一个发电机的检查部分:

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

Case insensitive 'in' - Python的启发。

由于extraData是您的案例中的list,因此对此解决方案不应该有任何显着的性能损失。

+0

这会慢两倍(列表上的两次迭代,并重新分配内存,因为对于生成器中的每个元素,都会创建一个小写字符串,该字符串作为不可变对象必须被复制),但是当然是大噩梦的复杂性。此外,现在您将从容器中获得第一个大写字母,因此该过程依赖于订购。 – lejlot

相关问题