【问题标题】:Converting Tuple inside of an array into a dictionary in Python将数组内的元组转换为Python中的字典
【发布时间】:2018-02-06 05:19:48
【问题描述】:

我一直在尝试解决这个问题,但我无法正确解决:( 我在 Django 中查询 mySQL 数据库,我的结果作为数组内的元组返回。请看下面的虚拟数据;

query_results = [
    (500, datetime.date(2017, 1, 1)),
    (302, datetime.date(2017, 1, 2)),
    (550, datetime.date(2017, 1, 3)),
    (180, datetime.date(2017, 1, 4)),
    (645, datetime.date(2017, 1, 5)),
    (465, datetime.date(2017, 1,6))
]

500、302、550 等……是我的记录。下一个元素是这些记录的日期。我想使用循环将它们附加到字典中,但我总是收到以下错误:

TypeError: list indices must be integers, not tuple.

谁能给我一些建议,告诉我如何将这些附加到这样的东西中:

myDict = {
    "record": "",
    "date": ""
}

非常感谢所有帮助!

【问题讨论】:

  • ... foo = dict(query_results) ?
  • 您想要字典列表吗?还是以第一个元素为键,第二个元素为值的字典?
  • 我想要 myDict = { "record": "302", "date": "somedate" }
  • 并记录字典中的所有内容
  • 您可能正在使用 django。您是如何获得这些结果的?

标签: python mysql django python-2.7


【解决方案1】:

你可以解压元组列表,然后用你想要的键将它们压缩到一个字典中,

dict(zip(['record', 'date'], zip(*query_results)))

哪个输出

{'date': (datetime.date(2017, 1, 1),
          datetime.date(2017, 1, 2),
          datetime.date(2017, 1, 3),
          datetime.date(2017, 1, 4),
          datetime.date(2017, 1, 5),
          datetime.date(2017, 1, 6)),
 'record': (500, 302, 550, 180, 645, 465)}

更新

如果您希望获得一个 dicts 列表,您可以直接使用列表推导式。

[dict(record=record, date=date) for record, date in query_results]

哪个输出

[{'date': datetime.date(2017, 1, 1), 'record': 500},
 {'date': datetime.date(2017, 1, 2), 'record': 302},
 {'date': datetime.date(2017, 1, 3), 'record': 550},
 {'date': datetime.date(2017, 1, 4), 'record': 180},
 {'date': datetime.date(2017, 1, 5), 'record': 645},
 {'date': datetime.date(2017, 1, 6), 'record': 465}]

【讨论】:

  • 您好,非常感谢!我能够解包元组。有没有办法可以实现这样的目标:mydict = { "record": 500, "date": 2017, 1, 1 },{ "record": 302, "date": 2017, 1, 2 },{ "record": 550, "date": 2017, 1, 3 } 我正在努力实现这一目标,因为我稍后会在我的 javascript 中传递这个 distionary。感谢您的回复!非常感谢
  • 谢谢米奇!这就是我需要的。比我想象的要简单得多! :) 再次感谢
【解决方案2】:

这个循环应该这样做:

    my_dict = {}
    for item in query_results:
        my_dict[item[0]] = item[1]

这会将您的记录(500、550 等)作为字典键(item[0] 部分)粘贴,以便您轻松调用它们。与这些键关联的值将是日期时间对象(item[1] 部分)。

如果您想要更复杂的解决方案,请告诉我们。

汤姆

【讨论】:

  • 非常感谢汤姆!这就是我需要的。我一直以此为目标。在我的下一步中,我如何命名记录记录?像这样.. mydict = { "record": 500, "date": 2017, 1, 1 },{ "record": 302, "date": 2017, 1, 2 },{ "record": 550, " date": 2017, 1, 3 } 我认为如果我采用这种格式,以后会更容易参考。
  • @Marvin 你所说的记录名称是什么意思?记录是字典中的一个字段。你的意思是有一本字典吗?然后你可以为每个标识符设置一个标识符。
  • 如果您使用字典,则每个键名必须是唯一的,并且将新值与现有键相关联会替换旧值。
【解决方案3】:

如果您希望它们作为字典中的元组,米奇的答案会起作用。

如果您想在每个循环中使用单独的字典,您可以这样做:

for result in query_results:
    myDict = {}
    myDict["record"] = result[0]
    myDict["date"] = result[1]
    your_operation()

或者,如果您希望记录作为键,日期作为值(除非您有重复记录,这可能非常有用),您可以这样做:

myDict = {}
for result in query_results:
    myDict[result[0]] = result[1]

那么你会有:

myDict = {"500": datetime.date(2017, 1, 1), 
          "302": datetime.date(2017, 1, 2), 
          etc..}

【讨论】:

    【解决方案4】:

    米奇回答的替代格式,因为帖子对想要的结果有点模棱两可:

    >list_of_dicts = [ {'result': tup[0], 'date': tup[1]} for tup in query_results]
    
    >list_of_dicts[0]    
    {'result':500, 'date':datetime.date(2017, 1, 1) }
    

    在其他讨论的基础上,如果您希望将每个记录键设置为日期时间,您可以将每个记录的字典构建为条目。这假定记录永远不会重复。在这种情况下,理解将如下所示:

    my_dict = {str(record) : date for record, date in query_results}
    

    dict 的样子:

    {"500": date1, "501", date2} #but not necessarily in order
    

    【讨论】:

      猜你喜欢
      • 2021-05-24
      • 2011-03-13
      • 2016-06-01
      • 2020-09-21
      • 2023-03-08
      • 2020-10-03
      • 2017-07-21
      • 1970-01-01
      • 2017-10-10
      相关资源
      最近更新 更多