2016-05-29 3 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