在Python中拆分元组 - 最佳实践?

时间:2008-09-03 13:48:31

标签: python tuples

我的Python代码中有一个方法,它返回一个元组 - 来自SQL查询的一行。假设它有三个字段:(jobId,label,username)

为了便于在函数之间传递它,我将整个元组作为一个名为“job”的变量传递。然而,最终,我想得到这些位,所以我一直在使用这样的代码: (jobId,label,username)= job

然而,我已经意识到这是一个维护噩梦,因为现在我永远不会在不破坏所有现有代码的情况下向结果集中添加新字段。我该怎么写这个?

以下是我最好的两个猜测: (jobId,label,username)=(job [0],job [1],job [2]) ......但是当你有15 ...... 20个字段时,这种情况不能很好地扩展

或者将SQL查询的结果直接转换为字典并传递给它(我无法控制它作为一个元组开始生活的事实,这对我来说是固定的)

9 个答案:

答案 0 :(得分:14)

@Staale

有一种更好的方法:

job = dict(zip(keys, values))

答案 1 :(得分:13)

我会说字典绝对是最好的方法。它易于扩展,允许您为每个值赋予一个合理的名称,并且Python具有许多用于使用和操作字典的内置语言功能。如果以后需要添加更多字段,则需要更改的是将元组转换为字典的代码以及实际使用新值的代码。

例如:

job={}
job['jobid'], job['label'], job['username']=<querycode>

答案 2 :(得分:5)

这是一个老问题,但是......

我建议在这种情况下使用命名元组:collections.namedtuple

这是你觉得有用的部分:

  

子类化对于添加新的存储字段没有用。相反,只需从_fields属性创建一个新的命名元组类型。

答案 3 :(得分:3)

也许这对你的情况来说太过分了,但是我很想创建一个“Job”类,它将元组作为构造函数参数并且具有相应的属性。然后我会传递这个类的实例。

答案 4 :(得分:2)

我会用字典。您可以通过这种方式将元组转换为字典:

values = <querycode>
keys = ["jobid", "label", "username"]
job = dict([[keys[i], values [i]] for i in xrange(len(values ))])

这将首先创建一个数组[[“jobid”,val1],[“label”,val2],[“username”,val3]],然后将其转换为字典。如果结果顺序或计数发生变化,您只需更改密钥列表以匹配新结果。

PS本身对Python仍然很新鲜,所以可能有更好的方法来做这件事。

答案 5 :(得分:2)

一个老问题,但由于没有人提到它,我将从Python Cookbook中添加这个:

Recipe 81252: Using dtuple for Flexible Query Result Access

此配方专门用于处理数据库结果,dtuple解决方案允许您按名称或索引号访问结果。这可以避免必须通过下标来访问所有内容,这很难维护,如您的问题中所述。

答案 6 :(得分:0)

使用元组,添加或更改字段总是很麻烦。你说字典会好得多,这是对的。

如果你想要一些稍微友好的语法,你可能想看一下关于一个简单的'类似结构'对象的答案this question。这样你可以传递一个对象,比如job,并且比元组或词典更容易访问它的字段:

job.jobId, job.username = jobId, username

答案 7 :(得分:0)

如果你正在使用MySQLdb包,你可以设置你的游标对象来返回dicts而不是元组。

import MySQLdb, MySQLdb.cursors
conn = MySQLdb.connect(..., cursorclass=MySQLdb.cursors.DictCursor)
cur = conn.cursor() # a DictCursor
cur2 = conn.cursor(cursorclass=MySQLdb.cursors.Cursor) # a "normal" tuple cursor

答案 8 :(得分:-2)

这个怎么样:

class TypedTuple:
    def __init__(self, fieldlist, items):
       self.fieldlist = fieldlist
       self.items = items
    def __getattr__(self, field):
       return self.items[self.fieldlist.index(field)]

然后你可以这样做:

j = TypedTuple(["jobid", "label", "username"], job)
print j.jobid

稍后可以轻松地将self.fieldlist.index(field)与字典查找交换...只需编辑您的__init__方法!像Staale这样的东西。