在Python中解包列表

3
假设我有一个MySQL表,通过MySQLDB进行访问。我有一个标准的

SELECT statement:
sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > '%d'" % (1000)

然后我使用光标执行它,并按以下方式提取列。

   cursor.execute(sql)
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]

是否有可能一次性地为所有列命名,例如:

for row in results:
    fname, lname, age, sex, income = unpack(row)

我可以随时执行以下操作:

fname, lname, age, sex, income = row[0], row[1], row[2], row[3], row[4]

但是我的表中有超过30个列,这让人感到痛苦。 请注意,虽然我现在正在使用MySQL,但我希望尽可能地与数据库无关;我们的管理者可能随时决定将所有内容移植到另一个数据库。


你应该在问题中删除对SQL的引用,因为它与问题无关。你有一个想要解构的数组;数据获取方式并不重要。 - Carcigenicate
为什么不直接写成 for fname, lname, age, sex, income in results: 呢? - njzk2
1
如果您期望的是固定数量和顺序的列,那么当表格布局发生变化时,您可能需要重新考虑使用 SELECT *,否则会导致错误。 - Mark Ransom
你甚至可以考虑在表上运行 PRAGMA table_info() 查询,以查看列数和标题名称。 - Ma0
3个回答

5

只需这样做:

fname, lname, age, sex, income = row

如果len(row)==5,它应该可以工作。否则,如果您使用的是Python 3,您可以使用扩展可迭代拆包
fname, lname, age, sex, income, *other = row

other 将是所有剩余元素的列表。

如果你使用的是 Python 2: 你可以像这个 回答 中的小函数一样使用:

def unpack_list(a, b, c, d, e, *f):
    return a, b, c, d, e, f

fname, lname, age, sex, income, other = unpack_list(*row)

如果你只想要前5个元素,就像@Ev.Kounis所说的那样,你可以这样做:
fname, lname, age, sex, income = row[:5]

您可以在其中任意一个位置(最好是最后一个)添加星号,以确保即使有更多的元素,执行也会继续进行。对row进行切片也是一种选择,因为它不会在例如 [1,2,3][:5] 这样的情况下抛出错误。 - Ma0
@Ev.Kounis 我已经修改了,但我认为这只适用于Python 3。 - jrjc
fname, lname, age, sex, income = row[:5] 在 Python 2 和 3 中都适用。 - vaultah

1

希望你能采用完全不同的方法?

您可以使用DictCursor通过名称引用内容。例如,

cursor = db.cursor(MySQLdb.cursors.DictCursor)
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
    function_with_fname(row['fname'])
    function_with_age(row['age'])

0
results = [[1,2,3,4,5],
['a', 'b', 'c', 'd', 'e'],
[True, False, True, False, True]
]

for one, two, three, four, five in results:
    print one, two, three, four, five
>>> 1 2 3 4 5
>>> a b c d e
>>> True False True False True

你还可以在你的for循环中解包这些值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接