Загрузка таблицы БД во вложенные словари в Python

0

У меня есть таблица в MySql DB, которую я хочу загрузить в словарь на python. столбцы таблицы выглядят следующим образом:

id,url,tag,tagCount

tagCount - это количество повторений тега для определенного URL-адреса. Поэтому в этом случае для загрузки этой таблицы мне нужен вложенный словарь, иными словами, словарь словаря. Поскольку каждый url имеет несколько тегов, для которых существуют разные tagCounts.the, я использовал это:( вся таблица составляет около 22 000 записей)

cursor.execute( ''' SELECT url,tag,tagCount
                    FROM wtp ''')

urlTagCount = cursor.fetchall()

d = defaultdict(defaultdict)

for url,tag,tagCount in urlTagCount:
    d[url][tag]=tagCount

print d

Прежде всего, я хочу знать, правильно ли это. И почему это так много времени? Есть ли более быстрые решения? Я загружаю эту таблицу в память, чтобы иметь быстрый доступ, чтобы избавиться от хлопот медленных операций с базой данных, но с этой медленной скоростью она стала узким местом, она даже намного медленнее, чем доступ к БД. и кому помочь? спасибо

  • 0
    Я попробовал это с небольшим примером, и это, кажется, работает. Вы упоминаете, что это занимает много времени, как долго это? В противном случае результат выглядит правильно? Во-вторых, с 22 000 записей ваш вывод "print d" будет огромным. Возможно, вам не понравится попробовать это в вашем переводчике.
Теги:
dictionary
nested

3 ответа

0
Лучший ответ

Мне удалось проверить код, и он работает отлично. Для тех любителей, как я, я предлагаю никогда не пытаться "печатать" очень большой вложенный словарь. что "печать d" в последней строке кода была проблемой, поскольку она была медленной. Если удалить его или попытаться получить доступ к словарю с помощью реальных клавиш, то это очень быстро.

1

возможно, вы могли бы попробовать с обычными ключами dicts и tuple, такими как

d = dict()

for url,tag,tagCount in urlTagCount:
    d[(url, tag)] = tagCount

В любом случае вы попытались:

d = defaultdict(dict)

вместо

d = defaultdict(defaultdict)
1

Вам нужно убедиться, что словарь (и каждый из вложенных словарей) существует до того, как вы присвоите ему ключ, значение. Для этой цели полезно использовать setdefault. Вы получите что-то вроде этого:

d = {}
for url, tag, tagCount in urlTagCount:
    d.setdefault(url, {})[tag] = tagCount
  • 0
    Я обычно использую python 2.4 или даже python 2.3, поэтому defaultdict был для меня новым. То, что я дал, тоже будет работать, но версия, приведенная в вопросе, кажется мне более понятной.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню