列表中有很多字典VS字典,列表很少?

meg*_*ger 29 python dataset pandas

我正在用数据集做一些练习:

列出了许多词典

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"}
]
Run Code Online (Sandbox Code Playgroud)

字典与几个列表

users2 = {
    "id": [0, 1, 2, 3, 4, 5, 6],
    "name": ["Ashley", "Ben", "Conrad", "Doug","Evin", "Florian", "Gerald"]
}
Run Code Online (Sandbox Code Playgroud)

熊猫数据帧

import pandas as pd
pd_users = pd.DataFrame(users)
pd_users2 = pd.DataFrame(users2)
print pd_users == pd_users2
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 我应该像用户或用户2那样构建数据集吗?
  2. 是否存在性能差异?
  3. 一个比另一个更可读吗?
  4. 我应该遵循标准吗?
  5. 我通常将这些转换为pandas数据帧.当我这样做时,两个版本都是相同的......对吗?
  6. 每个元素的输出都是正确的,所以如果我使用panda df是对的并不重要吗?

Yan*_*ier 26

这涉及面向列的数据库与面向行的数据库.您的第一个示例是面向行的数据结构,第二个示例是面向列的.在Python的特定情况下,第一个使用插槽可以显着提高效率,这样就不需要为每一行复制列的字典.

哪种形式更好地取决于您对数据的处理方式; 例如,如果您只访问所有行,则面向行是自然的.面向列的同时可以更好地使用缓存,例如当你在特定字段中搜索时(在Python中,这可能会通过大量使用引用来减少;像数组这样的类型可以优化它).传统的面向行的数据库经常使用面向列的排序索引来加速查找,并且了解这些技术后,您可以使用键值存储实现任何组合.

Pandas确实将您的示例转换为相同的格式,但转换本身对于面向行的结构来说更昂贵,因为必须读取每个单独的字典.所有这些成本可能都很小.

在您的示例中有第三个选项不明显:在这种情况下,您只有两列,其中一列是从0开始的连续范围内的整数ID.这可以按条目本身的顺序存储,这意味着整个结构会在您调用的列表中找到users2['name']; 但值得注意的是,没有他们的位置,条目是不完整的.该列表使用enumerate()转换为行.数据库通常也有这种特殊情况(例如,sqlite rowid).

通常,从保持代码合理的数据结构开始,只有在了解用例并且存在可测量的性能问题时才进行优化.像熊猫这样的工具可能意味着大多数项目都能正常运行而不需要微调.


the*_*ant 6

用户

  1. 当您需要添加一些新用户时,只需刷新dict所有用户详细信息并附加它

  2. 像@StevenRumbalski建议的那样可以轻松排序

  3. 搜索会很容易

  4. 随着记录的增长,这更加紧凑,易于管理(对于一些非常多的记录,我认为我们需要比用户更好的东西)

Users2

  1. 我个人第一次看到这个,如果我有大量的记录,我不会接近这个.

PS:不过,我想了解的优势,users2users 同样一个很好的问题


dla*_*ask 5

users一般意义上实际上是user元素的集合。所以最好将user元素定义为一个独立的实体。所以你的第一个选择是正确的。


Anu*_*rma 5

查询的时间复杂度 -

  • 清单 - O(n)
  • Dicts - O(1)

但是,如果您的数据不是那么大并且现代处理器非常有效,那么这不会有太大影响.
你应该选择查找语法清晰可读的方法(可读性很重要).
第一个选项非常合适,因为变量是用户的集合(已经分配了id),而第二个选项只是用户名和id的集合.