【发布时间】:2018-04-18 09:26:07
【问题描述】:
我的目标是为更长的元组或更长的列表更优雅地解包子元组或子列表。
例如,我有一个带有子数组的数组
s = [['yellow', 1,5,6], ['blue', 2,8,3], ['yellow', 3,4,7], ['blue',4,9,1], ['red', 1,8,2,11]]
用 2 个元素的数组和子元组或子列表进行实验,我有以下内容:
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
或
s = [['yellow', 1], ['blue', 2], ['yellow', 3], ['blue', 4], ['red', 1]]
无论是元组还是列表,我都可以解压 's':
for k, v in s:
print('k = {0}, v = {1}'.format(k,v))
产生结果
k = yellow, v = 1
k = blue, v = 2
k = yellow, v = 3
k = blue, v = 4
k = red, v = 1
假设我有以下数组,每个子数组包含四个元素:
bongo =
[[1, 2, 3, 4], [6, 3, 2, 3], [5, 7, 11, 15], [2, 4, 7, 8]]
我可以使用变量 a、b、c、d 解压“bongo”
for a,b,c,d in bongo:
print('a = {0}, b = {1}, c={2}, d={3}'.format(a,b,c,d))
a = 1, b = 2, c=3, d=4
a = 6, b = 3, c=2, d=3
a = 5, b = 7, c=11, d=15
a = 2, b = 4, c=7, d=8
尽管能够解压缩混合的 chr/数字子数组,但我似乎在解压缩混合的“chr”和数字子列表(或子元组(未显示,但得到相同的结果))时遇到问题:
s = [['yellow', 1,5,6], ['blue', 2,8,3], ['yellow', 3,4,7], ['blue',
4,9,1], ['red', 1,8,2,11]]
也就是说,在进行解包时,我得到了想要的结果,但出现了错误:
for a,b,c,d in s:
print('a = {0}, b = {1}, c = {2}, d = {3} '.format(a,b,c,d))
a = yellow, b = 1, c = 5, d = 6
a = blue, b = 2, c = 8, d = 3
a = yellow, b = 3, c = 4, d = 7
a = blue, b = 4, c = 9, d = 1
Traceback (most recent call last):
File "<pyshell#288>", line 1, in <module>
for a,b,c,d in s:
ValueError: too many values to unpack (expected 4)
我的问题:有没有更优雅的解包方式,比如我想得到第一个元素,比如键,然后剩下的?
用伪代码来说明——它不能直接在python中工作:
for k[0][0], v[0][1:4] in s:
print('k[0][0] = {0}, v[0][1:4] = {1}'.format(k[0][0],v[0][1:4]))
如得到如下输出:
a = yellow, b = 1, c = 5, d = 6
a = blue, b = 2, c = 8, d = 3
a = yellow, b = 3, c = 4, d = 7
a = blue, b = 4, c = 9, d = 1
灵感: 尝试使用第 3.4.1 段 https://docs.python.org/3/library/collections.html#collections.defaultdict 的 defaultdict,特别是使用子元组解包数组。
谢谢, 悉尼的安东尼
【问题讨论】:
标签: python arrays list dictionary tuples