在Python 3中,我可以执行以下操作(另请参阅PEP3132 on Extended Iterable Unpacking):
a, *b = (1, 2, 3)
# a = 1; b = (2, 3)
Run Code Online (Sandbox Code Playgroud)
我能做些什么才能在Python 2.x中实现同样优雅?
我知道我可以使用单元素访问和切片操作,但我想知道是否有更多的pythonic方式.我的代码到目前为止:
a, b = (1, 2, 3)[0], (1, 2, 3)[1:]
# a = 1; b = (2, 3)
Run Code Online (Sandbox Code Playgroud) 如何在Python2中处理可变长度子列表解包?
在Python3中,如果我有可变的子列表长度,我可以使用这个成语:
>>> x = [(1, 2,3,4,5), (2, 4,6), (3, 5,6,7,8,9)]
>>> for i, *item in x:
... print (item)
...
[2, 3, 4, 5]
[4, 6]
[5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
在Python2中,它是一个无效的语法:
>>> x = [(1, 2,3,4,5), (2, 4,6), (3, 5,6,7,8,9)]
>>> for i, *item in x:
File "<stdin>", line 1
for i, *item in x:
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这个问题与解释最大大小为n的可变长度列表的惯用法有一点不同,其中解决方案需要固定长度的知识.
这个问题特定于解决Python2中的问题.
我有一些输入值的列表,其中第一对是强制性的,最后一对是可选的.是否有任何简单的方法可以使用元组解包将这些分配给变量,如果缺少可选参数则获取None.
例如.
a = [1,2]
foo, bar, baz = a
# baz == None
Run Code Online (Sandbox Code Playgroud)
理想情况下,可以是任何长度 - 包括超过3(其他物品扔掉).
目前我正在使用带有参数名称列表的zip来获取字典:
items = dict(zip(('foo', 'bar', 'baz'), a))
foo = items.get('foo', None)
bar = items.get('bar', None)
baz = items.get('baz', None)
Run Code Online (Sandbox Code Playgroud)
但它有点啰嗦.
我有一个元组列表,每个元组包含1到5个元素.我想将这些元组解压缩为五个值,但这对于少于五个元素的元组不起作用:
>>> t = (1,2) # or (1) or (1,2,3) or ...
>>> a,b,c,d,e = (t)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 2 values to unpack
Run Code Online (Sandbox Code Playgroud)
可以将不存在的值设置为None.基本上,如果这个函数我正在寻找更好(更密集)的方法:
def unpack(t):
if len(t) == 1:
return t[0], None, None, None, None
if len(t) == 2:
return t[0], t[1], None, None, None
if len(t) == 3:
return t[0], t[1], t[2], None, None
if len(t) == 4:
return t[0], t[1], t[2], t[3], None …Run Code Online (Sandbox Code Playgroud) 假设我有一个MySQL表,我通过MySQLDB访问.我有一个标准
SELECT statement:
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > '%d'" % (1000)
Run Code Online (Sandbox Code Playgroud)
然后我用光标执行它并拔出列,如下所示.
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]
Run Code Online (Sandbox Code Playgroud)
是否可以在单个语句中分配所有列名?就像是:
for row in results:
fname, lname, age, sex, income = unpack(row)
Run Code Online (Sandbox Code Playgroud)
我总能这样做:
fname, lname, age, sex, income = row[0], row[1], row[2], row[3], row[4]
Run Code Online (Sandbox Code Playgroud)
但是我的桌子上有30多列,这很痛苦.请注意,虽然我现在正在使用MySQL,但我希望它尽可能与数据库无关; 我们仁慈的霸主可能决定在任何时候将一切都移植到另一个数据库.
我正试图找到一种更好,更pythonic的方式来解决这段代码:
for i in rows:
row_data = i.findAll('td')
serial = row_data[0]
hostname = row_data[1]
owner = row_data[2]
memory = row_data[3]
processor = row_data[4]
os = row_data[5]
model = row_data[6]
ip = row_data[7]
Run Code Online (Sandbox Code Playgroud)
我正在尝试做这样的事情:
[serial, hostname, owner, memory, etc..] = row_data[:7]
Run Code Online (Sandbox Code Playgroud)
关于如何实现这一点的任何想法?
有或没有索引我收到此消息:[serial,hostname,owner,memory,processor,os,model,be_ip] = row_data ValueError:要解压的值太多
例如,如果我要指派a, b, c从l = [1,2,3,4,5],我可以做
a, b, c = l[:3]
Run Code Online (Sandbox Code Playgroud)
但是,如果l只有[1,2]([1]或[])怎么办?
有没有一种方法可以自动将其余变量设置为None或''或0或其他某个默认值?
我考虑过在分配以匹配变量数量之前使用默认值扩展列表,但是只是想知道是否有更好的方法。