【问题标题】:Preserve ordering when consolidating two lists into a dict将两个列表合并到一个字典中时保留顺序
【发布时间】:2013-02-28 15:47:28
【问题描述】:

我正在使用 mysqldb 连接到 mysql 数据库,我在一个变量中获取元数据/列,在另一个变量中获取数据/行。现在我必须将列表和元组合并到一个字典中并保留顺序。我知道 dicts 是无序的,但是有什么替代方法吗?

cursor.description = ['userid', 'cid', 'mid', 'did', 'msid']
data = (29L, 35L, None, '', None)

result = {}
for i in data:
    result.update = dict(zip(cols, i))

预期结果

result = {'userid': 29L, 'cid': 35L, 'mid': None, 'did': '', 'msid': None}

【问题讨论】:

  • "我知道 dicts 是无序的..." 你希望通过创建 dict 来解决什么问题?
  • 请注意,您可以通过自定义Cursorgeert.vanderkelen.org/… 获得dicts。您可以将其与OrderedDict 结合使用,以从.fetch 操作和游标迭代中获取有序字典。

标签: python list dictionary tuples mysql-python


【解决方案1】:

使用OrderedDict

from collections import OrderedDict

result = OrderedDict(zip(cursor.description, data))

例子:

>>> from collections import OrderedDict
>>> cols = ['userid', 'cid', 'mid', 'did', 'msid']
>>> data = (29L, 35L, None, '', None)
>>> result = OrderedDict(zip(cols, data))
>>> result
OrderedDict([('userid', 29L), ('cid', 35L), ('mid', None), ('did', ''), ('msid', None)])
>>> result['userid']
29L
>>> result['cid']
35L
>>> list(result)
['userid', 'cid', 'mid', 'did', 'msid']

从 CPython 3.6 和 Python 3.7 开始,常规的 dicts 按插入顺序排序,因此如果您知道您的代码将在合适的版本下运行,您可以在此处使用 dict 而不是 OrderedDict

仅限 Python 3.7+(或 CPython 下的 Python 3.6):

>>> cols = ['userid', 'cid', 'mid', 'did', 'msid']
>>> data = (29, 35, None, '', None)
>>> result = dict(zip(cols, data))
>>> result
{'userid': 29, 'cid': 35, 'mid': None, 'did': '', 'msid': None}
>>> result['userid']
29
>>> result['cid']
35
>>> list(result)
['userid', 'cid', 'mid', 'did', 'msid']

【讨论】:

  • 对于早于 2.7 的 Python 版本,您需要安装它。 pip install ordereddict
  • 如何制作结果字典? [[('userid', 32L), ('cid', 40L), ('mid', None), ('did', ''), ('msid', None)]]
  • result 字典(OrderedDictdict的子类)。它也是有序的,不像普通的dict。例如,您可以访问result['userid'],基本上将其视为dict
【解决方案2】:

忘记字典

>>> cols=['userid', 'cid', 'mid', 'did', 'msid']
>>> data = (29L, 35L, None, '', None)
>>> zip(cols,data)
[('userid', 29L), ('cid', 35L), ('mid', None), ('did', ''), ('msid', None)]

如果你有很多结果集,那么先设置一个数组,然后append 给它

>>> myarray.append(zip(cols,data))

【讨论】:

  • 很好,但它使查找特定列变得很麻烦。也许我只想写row['userid']
猜你喜欢
  • 2018-05-25
  • 2021-04-10
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 2023-02-18
相关资源
最近更新 更多