【问题标题】:Unpack a list in Python在 Python 中解压列表
【发布时间】:2016-12-26 17:59:10
【问题描述】:

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

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 的引用,因为它真的无关紧要。您有一个要解构的数组;你如何获得数据并不重要。
  • 为什么不直接写for fname, lname, age, sex, income in results:
  • 如果您期望固定数量和顺序的列,您可能需要重新考虑SELECT *,如果表格布局发生变化,您会破坏事情。
  • 您甚至可以考虑对表运行PRAGMA table_info() 查询以查看列数和标题名称

标签: list python-2.6


【解决方案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'])

【讨论】:

    【解决方案2】:

    只要做:

    fname, lname, age, sex, income = row
    

    如果len(row)==5 它应该可以工作,否则,如果你有python 3,你可以使用extended iterable unpacking

    fname, lname, age, sex, income, *other = row
    

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

    如果你有 python 2: 您可以使用answer 中的小函数:

    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] 时抛出错误
    • @Ev.Kounis 我编辑过,但我相信它只是 python 3。
    • fname, lname, age, sex, income = row[:5] 适用于 Python 2 和 3。
    【解决方案3】:
    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 循环本身中的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 2021-12-22
      • 2017-04-24
      • 1970-01-01
      • 2013-11-09
      相关资源
      最近更新 更多