Подтвердить что ты не робот

Список со многими словарями VS словарь с несколькими списками?

Я делаю некоторые упражнения с такими наборами данных:

Список со многими словарями

users = [
    {"id": 0, "name": "Ashley"},
    {"id": 1, "name": "Ben"},
    {"id": 2, "name": "Conrad"},
    {"id": 3, "name": "Doug"},
    {"id": 4, "name": "Evin"},
    {"id": 5, "name": "Florian"},
    {"id": 6, "name": "Gerald"}
]

Словарь с несколькими списками

users2 = {
    "id": [0, 1, 2, 3, 4, 5, 6],
    "name": ["Ashley", "Ben", "Conrad", "Doug","Evin", "Florian", "Gerald"]
}

Pandas dataframes

import pandas as pd
pd_users = pd.DataFrame(users)
pd_users2 = pd.DataFrame(users2)
print pd_users == pd_users2

Вопросы:

  • Должен ли я структурировать наборы данных, такие как пользователи или как users2?
  • Существуют ли различия в производительности?
  • Является ли еще более читаемым, чем другой?
  • Есть ли стандарт, которому я должен следовать?
  • Я обычно конвертирую их в pandas данные. Когда я это делаю, обе версии идентичны... правильно?
  • Результат для каждого элемента верен, поэтому не имеет значения, работает ли с panda df правильно?
4b9b3361

Ответ 1

Это относится к базам данных, ориентированным на столбцы, и ориентированным по строкам. Ваш первый пример - структура данных, ориентированная на строки, а вторая - ориентированная на столбцы. В частном случае Python первое может быть сделано значительно более эффективно с помощью slots, так что словарь столбцов не нужно дублировать для каждой строки,

Какая форма работает лучше всего зависит от того, что вы делаете с данными; например, ориентированная строка является естественной, если вы только когда-либо обращаетесь ко всем строкам. Столбец, ориентированный тем временем, намного лучше использует кеши и такие, когда вы ищете определенное поле (в Python это может быть уменьшено за счет интенсивного использования ссылок, таких как array может оптимизировать это). Традиционные базы данных, ориентированные на строки, часто используют сортированные индексы, ориентированные на столбцы, для ускорения поиска, и, зная эти методы, вы можете реализовать любую комбинацию, используя хранилище значений ключа.

Pandas преобразует оба примера в один и тот же формат, но само преобразование является более дорогостоящим для структуры, ориентированной на строки, просто потому, что каждый отдельный словарь должен быть прочитан. Все эти затраты могут быть незначительными.

В вашем примере третий вариант не проявляется: в этом случае у вас есть только два столбца, один из которых представляет собой целочисленный идентификатор в смежном диапазоне от 0. Это может быть сохранено в порядке самих записей, что означает вся структура будет найдена в списке, который вы назвали users2['name']; но, в частности, записи неполны без их положения. Список переводится в строки, используя enumerate(). Для баз данных также часто используется этот особый случай (например, sqlite rowid).

В общем, начните с структуры данных, которая сохраняет ваш код разумным и оптимизируется только тогда, когда вы знаете свои варианты использования и имеете измеримую производительность. Такие инструменты, как Pandas, вероятно, означают, что большинство проектов будут функционировать просто отлично без физкультуры.

Ответ 2

Пользователи

  • Когда вам нужно добавить нового пользователя, просто создайте новую dict всех деталей пользователя и добавьте ее

  • Легко сортировать по предложению @StevenRumbalski

  • Поиск будет легким.

  • Это более компактно и легко управляется по мере роста записи (для некоторого очень большого количества записей я думаю, что нам нужно что-то лучше, чем пользователи)

потребляющие2

  • Лично я вижу это в первый раз, и я не подхожу к этому, если у меня большое количество записей.

PS: Но я хотел бы узнать преимущества users2 над users  Снова приятный вопрос

Ответ 3

Сложность времени для поиска в

  • Список - O (n)
  • Dicts - O (1)

Но это не повредит, если ваши данные не такие большие, а современные процессоры на сегодняшний день достаточно эффективны.
Вы должны пойти с тем, в котором поиск синтаксически чист и читабель (вопросы читаемости).
Первый вариант вполне уместен, так как переменная представляет собой набор пользователей (которым присвоен идентификатор), а второй - просто коллекция имен пользователей и идентификаторов.

Ответ 4

users в общем смысле представляет собой набор элементов user. Поэтому лучше определить элемент user как автономный объект. Итак, ваш первый вариант - правильный.

Ответ 5

Некоторые ответы в отношении аспекта pandas:

  • Оба фрейма данных действительно одинаковы и ориентированы на столбцы, что хорошо, потому что pandas лучше всего работает, когда данные в каждом столбце однородны (т.е. числа могут быть сохранены как int и floats). Основной причиной использования pandas в первую очередь является то, что вы можете делать векторизованные числовые операции, которые на порядки быстрее, чем чистый питон, но это зависит от столбчатой ​​организации, когда данные имеют гетерогенный тип.
  • Вы можете сделать pd_users.T для транспонирования, если хотите, и затем увидите (через info() или dtypes), что все затем сохраняется как объект общего назначения, потому что столбец содержит как строки, так и числа.
  • После преобразования вы можете сделать pd_users.set_index('id') так, чтобы ваш фреймворк был, по сути, словарем с id в качестве ключей. Или наоборот name.
  • Это довольно распространенный (и обычно довольно быстрый) для изменения индексов, а затем их изменение, транспонирование, подмножество и т.д. при работе с pandas, поэтому обычно не нужно слишком много думать о структуре в начале. Просто измените его, как вам нужно на лету.
  • Это может произойти по касательной, но более простой аналог pandas того, что у вас выше, может быть Series, а не DataFrame. Ряд по существу является столбцом кадра данных, хотя это действительно просто одномерный массив данных с индексом ( "ключи" ).

Быстрая демонстрация (используя df в качестве имени файловой системы, общее соглашение):

>>> df.set_index('name')

         id
name       
Ashley    0
Ben       1
Conrad    2
Doug      3
Evin      4
Florian   5
Gerald    6

>>> df.set_index('name').T

name  Ashley  Ben  Conrad  Doug  Evin  Florian  Gerald
id         0    1       2     3     4        5       6

>>> df.set_index('name').loc['Doug']

id    3
Name: Doug, dtype: int64

Ответ 6

Первый вариант списка словарей будет намного лучше по нескольким причинам. В списке содержатся такие методы, как EXTEND, APPENT, PUSH, которые не всегда доступны со словарями.