Mat*_*ner 2 python list-comprehension python-3.x
>>> c = 'A/B,C/D,E/F'
>>> [a for b in c.split(',') for (a,_) in b.split('/')]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
ValueError: need more than 1 value to unpack
Run Code Online (Sandbox Code Playgroud)
预期的结果是['A', 'C', 'E']
.
这就是我期望的方式,但显然它已经在Python中回归:
>>> [a for (a, _) in b.split('/') for b in c.split(',')]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
Run Code Online (Sandbox Code Playgroud)
你失败的原因b.split('/')
是没有产生2元组.双列表理解意味着您希望将笛卡尔积作为平流而不是矩阵.那是:
>>> [x+'/'+y for y in 'ab' for x in '012']
['0/a', '1/a', '2/a', '0/b', '1/b', '2/b']
# desire output 0,1,2
# not output 0,1,2,0,1,2
Run Code Online (Sandbox Code Playgroud)
您不是在寻找6个答案,而是在寻找3.您想要的是:
>>> [frac.split('/')[0] for frac in c.split(',')]
['A', 'C', 'E']
Run Code Online (Sandbox Code Playgroud)
即使你使用嵌套列表理解,你也会得到笛卡尔积(3x2 = 6),并意识到你有重复的信息(你不需要x2):
>>> [[x+'/'+y for y in 'ab'] for x in '012']
[['0/a', '0/b'], ['1/a', '1/b'], ['2/a', '2/b']]
# desire output 0,1,2
# not [0,0],[1,1],[2,2]
Run Code Online (Sandbox Code Playgroud)
以下是做事的等效方法.不过,我对这个比较中生成器和列表之间的主要区别有所区别.
列表形式的笛卡尔积:
((a,b,c) for a in A for b in B for c in C)
#SAME AS#
((a,b,c) for (a,b,c) in itertools.product(A,B,C))
#SAME AS#
for a in A:
for b in B:
for c in C:
yield (a,b,c)
Run Code Online (Sandbox Code Playgroud)
矩阵形式的笛卡尔积:
[[[(a,b,c) for a in A] for b in B] for c in C]
#SAME AS#
def fC(c):
def fB(b,c):
def fA(a,b,c):
return (a,b,c)
yield [f(a,b,c) for a in A]
yield [fB(b,c) for b in B]
[fC(c) for c in C]
#SAME AS#
Cs = []
for c in C:
Bs = []
for b in B:
As = []
for a in A:
As += [a]
Bs += [As]
Cs += [Bs]
return Cs
Run Code Online (Sandbox Code Playgroud)
重复应用功能列表
({'z':z} for x in ({'y':y} for y in ({'x':x} for x in 'abc')))
#SAME AS#
for x in 'abc':
x2 = {'x':x}
y2 = {'y':x2}
z2 = {'z':y2}
yield z2
#SAME AS#
def f(x):
return {'z':{'y':{'x':x}}}
return [f(x) for x in 'abc'] # or map(f,'abc')
Run Code Online (Sandbox Code Playgroud)