Я делаю много списков и сортировку словаря ... и это вызывает ошибки памяти на сайте Python - PullRequest
1 голос
/ 03 апреля 2010

Я получил данные из таблицы журнала в моей базе данных. Затем я начал находить уникальных пользователей, сравнивать / сортировать списки и т. Д.

В конце концов я приступил к этому.

stats = {'2010-03-19': {'date': '2010-03-19', 'unique_users': 312, 'queries': 1465}, '2010-03-18': {'date': '2010-03-18', 'unique_users': 329, 'queries': 1659}, '2010-03-17': {'date': '2010-03-17', 'unique_users': 379, 'queries': 1845}, '2010-03-16': {'date': '2010-03-16', 'unique_users': 434, 'queries': 2336}, '2010-03-15': {'date': '2010-03-15', 'unique_users': 390, 'queries': 2138}, '2010-03-14': {'date': '2010-03-14', 'unique_users': 460, 'queries': 2221}, '2010-03-13': {'date': '2010-03-13', 'unique_users': 507, 'queries': 2242}, '2010-03-12': {'date': '2010-03-12', 'unique_users': 629, 'queries': 3523}, '2010-03-11': {'date': '2010-03-11', 'unique_users': 811, 'queries': 4274}, '2010-03-10': {'date': '2010-03-10', 'unique_users': 171, 'queries': 1297}, '2010-03-26': {'date': '2010-03-26', 'unique_users': 299, 'queries': 1617}, '2010-03-27': {'date': '2010-03-27', 'unique_users': 323, 'queries': 1310}, '2010-03-24': {'date': '2010-03-24', 'unique_users': 352, 'queries': 2112}, '2010-03-25': {'date': '2010-03-25', 'unique_users': 330, 'queries': 1290}, '2010-03-22': {'date': '2010-03-22', 'unique_users': 329, 'queries': 1798}, '2010-03-23': {'date': '2010-03-23', 'unique_users': 329, 'queries': 1857}, '2010-03-20': {'date': '2010-03-20', 'unique_users': 368, 'queries': 1693}, '2010-03-21': {'date': '2010-03-21', 'unique_users': 329, 'queries': 1511}, '2010-03-29': {'date': '2010-03-29', 'unique_users': 325, 'queries': 1718}, '2010-03-28': {'date': '2010-03-28', 'unique_users': 340, 'queries': 1815}, '2010-03-30': {'date': '2010-03-30', 'unique_users': 329, 'queries': 1891}}

Это не большой словарь. Но когда я пытаюсь сделать что-то последнее ... это обрушивается на меня.

 for k, v in stats:
    mylist.append(v)

слишком много значений для распаковки

Что, черт возьми, это значит ??? СЛИШКОМ МНОГО ЗНАЧЕНИЙ ДЛЯ РАСПАКОВКИ.

Ответы [ 3 ]

7 голосов
/ 03 апреля 2010

Если вам нужны только те значения, которые вы можете просто сделать:

mylist = stats.values()

Если вам нужна пара ключ-значение, вы должны выполнить итерацию элементов dict :

mylist = []
for k,v in stats.iteritems():
    mylist.append(v)

В коде вашего вопроса вы просто перебираете слова dict keys .

Поскольку вы присваиваете кортежу одну строку (ключ), ее символы вместо этого повторяются; Логично, что эта полная строка не может быть распакована в (k, v) кортеж, если только в ситуации, когда у вас будет строка длиной ровно два Это объясняет сообщение об ошибке: вы пытаетесь распаковать каждый отдельный символ строки только в два заполнителя (k и v).

5 голосов
/ 03 апреля 2010

Проблема в том, что когда вы перебираете словарь, используя цикл for ... in ..., вы перебираете только ключи. Вы можете продемонстрировать это с помощью:

>>> for x in stats: print x
... 
2010-03-19
2010-03-18
etc

поэтому, когда вы делаете for k,v in stats:, он пытается присвоить строку кортежу (k, v). Поскольку строки являются итеративными, он будет пытаться назначать символ за раз, поэтому он будет назначать '2' для k и '0' для v, но ему некуда присваивать оставшиеся символы - отсюда и ошибка.

Вам нужно либо вызвать метод dict iteritems, чтобы получить последовательность кортежей (ключ, значение), либо вызвать метод itervalues, чтобы получить последовательность значений, поскольку вы не используете ключ.

1 голос
/ 03 апреля 2010

Поведение по умолчанию при итерации словаря эквивалентно вызову его keys() метода.

Таким образом, следующие значения эквивалентны:

>>> for k in stats: print k
>>> for k in stats.keys(): print k

Если вы хотите перебрать ключи и значения за один прогон, вы должны вызвать items().

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