【问题标题】:How can I simulate .fetchall() in Python?如何在 Python 中模拟 .fetchall()?
【发布时间】:2013-11-17 03:31:53
【问题描述】:

这个问题最好标题为“如何将字典列表转换为元组列表”,除非我不能 100% 确定这是正确的。

我正在修改我在网上找到的刮板,它使用 .fetchall() 从数据库中抓取数据。

cur.execute("SELECT num, location FROM table WHERE location='My Town';")
the_query = cur.fetchall()

因此,脚本的其余部分期望 the_query 是一个元组列表,我认为意味着 the_query 看起来像这样:

[(081143282, 'My Town'),(091338218, 'My Town')] ...

这个爬虫的修改版本必须从 JSON 提要中获取数据,而不是使用 fetchall 从 sqlite 数据库中获取数据。使用 demjson.decode(),我最终得到如下数据:

[{u'num': u'081143282', u'location': u'My Town'}, {u'num': u'081143282', u'location': u'My Town'}]

再次,我认为这是一个字典列表,但由于我仍在学习这些不同的结构,我可能会弄错。

我尝试使用 .item() 和 zip(*) 将 demjson.decode() 的结果转换为元组列表,但到目前为止我无法使其工作。

谁能指导我完成这个?

【问题讨论】:

    标签: python json list dictionary tuples


    【解决方案1】:

    您可以遍历字典列表并使用values() 函数从每个字典中获取所有值,然后将它们转换为元组。

    data = [{u'num': u'081143282', u'location': u'My Town'},
            {u'num': u'081143282', u'location': u'My Town'}]
    print [(int(currentDict["num"]), currentDict["location"]) for currentDict in data]
    

    输出

    [(81143282, u'My Town'), (81143282, u'My Town')]
    

    【讨论】:

    • 您的答案的早期版本实际上可能更好。在我的特定用例中,num 并不总是 int。但这似乎奏效了。非常感谢。
    • @Kirkman14 但您的预期输出为[(081143282, 'My Town'),(091338218, 'My Town')]。这就是我必须改变的原因。
    • @Kirkman14 如果对您有帮助,请不要忘记接受答案:)
    • 不使用[0]values()values()[1] 有风险吗?我认为字典是无序的,最好不要相信任何顺序......
    【解决方案2】:

    你的问题的第一部分是你有字典(它们是无序的)并且你想要序列化那些(在元组中)。所以你需要一种方法来指定字典键被转换为什么顺序。

    tupleOrder = ('num', 'location')
    

    现在我们有了,我们需要可以将字典转换为有序的代码:

    def asSeries(aDictionary):
        return (aDictionary.get(key) for key in tupleOrder)
    

    这将返回一个生成器。要将其实现为元组,我们只需使用 tuple() 函数:

    def asSeries(aDictionary):
        return tuple(aDictionary.get(key) for key in tupleOrder)
    

    现在,如果我们想将这一切都归结为一个衬里:

    [tuple(dict.get(key) for key in tupleOrder) for dict in data]
    

    你在这里有一些灵活性。您可以使用命名键(而不是编号索引)在一处更改您的 tupleOrder。想使用lists?只需将tuple() 替换为list()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2022-10-17
      • 2017-11-01
      • 2016-11-12
      相关资源
      最近更新 更多