Быстрый поиск списка питонов? - PullRequest
0 голосов
/ 02 октября 2010

У меня есть словарь и список. Список состоит из значений. В словаре есть все значения плюс еще несколько значений.

Я пытаюсь подсчитать, сколько раз значения в списке отображаются в словаре для пары ключ / значение.

Это выглядит примерно так:

for k in dict:
 count = 0
 for value in dict[k]:
  if value in list:
   count += 1
   list.remove(value)
 dict[k].append(count)

У меня есть что-то вроде ~ 1 миллиона записей в списке, поэтому поиск по ним каждый раз идет очень медленно.

Есть ли какой-нибудь более быстрый способ сделать то, что я пытаюсь сделать?

Спасибо, Rohan

Ответы [ 4 ]

2 голосов
/ 02 октября 2010

Если вы выполняете поиск в списке, а затем конвертируете этот список в набор, это будет намного быстрее:

listSet = set(list)

for k, values in dict.iteritems():
    count = 0
    for value in values:
        if value in listSet:
            count += 1
            listSet.remove(value)
    dict[k].append(count)

list = [elem for elem in list if elem in listSet]
# return the original list without removed elements
2 голосов
/ 02 октября 2010

У вас будут всевозможные проблемы с этим кодом, поскольку вы одновременно удаляете элементы из своего списка и используете в нем индекс.Кроме того, вы используете list в качестве имени переменной, что приводит к интересным проблемам, так как list также является типом.

Вы сможете добиться значительного улучшения производительности (как только вы исправитедругие дефекты в вашем коде), используя набор вместо списка.Что вы теряете, используя набор, так это упорядочивание элементов и возможность того, чтобы элемент появлялся в списке более одного раза.(Также ваши вещи должны быть хэшируемыми.) Вы получаете O (1) время поиска.

0 голосов
/ 02 октября 2010

Я изменил последнюю строку, чтобы добавить в словарь. Это по умолчанию (список). Надеюсь, это прояснит некоторые вопросы. Еще раз спасибо.

0 голосов
/ 02 октября 2010
for val in my_list:
   if val in my_dict:
      my_dict[val] = my_dict[val] + 1
   else:
      my_dict[val] = 0

Что вам еще нужно

  • Обрабатывать случай, когда val не в dict
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...