在具有多个iterable的python列表理解中定位条件语句
我很难理解,为什么在多个iterables的列表理解中放置相同的条件语句会影响结果在具有多个iterable的python列表理解中定位条件语句,python,list-comprehension,Python,List Comprehension,我很难理解,为什么在多个iterables的列表理解中放置相同的条件语句会影响结果 >>> boys = 'Jim','Jeff' >>> girls = 'Bonnie', 'Buffy' # This generates four tuples as expected >>> [(b,g) for b in boys for g in girls] [('Jim', 'Bonnie'), ('Jim', 'Buffy'), ('Jeff
>>> boys = 'Jim','Jeff'
>>> girls = 'Bonnie', 'Buffy'
# This generates four tuples as expected
>>> [(b,g) for b in boys for g in girls]
[('Jim', 'Bonnie'), ('Jim', 'Buffy'), ('Jeff', 'Bonnie'), ('Jeff', 'Buffy')]
# If the conditional "if b[-1] not in g" is at the end of the LC we get 3
>>> [(b,g) for b in boys for g in girls if b[-1] not in g]
[('Jim', 'Bonnie'), ('Jim', 'Buffy'), ('Jeff', 'Bonnie')]
# If the conditional is after the first sequence, we only get two results
>>> [(b,g) for b in boys if b[-1] not in g for g in girls]
[('Jim', 'Bonnie'), ('Jim', 'Buffy')]
如果其他人已经就StackOverflow提出/回答了此问题,请提前道歉。您所做的与:
>>> boys = 'Jim','Jeff'
>>> girls = 'Bonnie', 'Buffy'
>>>
>>> out = []
>>> for b in boys:
... for g in girls:
... out.append((b,g))
...
>>> out
[('Jim', 'Bonnie'), ('Jim', 'Buffy'), ('Jeff', 'Bonnie'), ('Jeff', 'Buffy')]
>>>
>>> out = []
>>> for b in boys:
... for g in girls:
... if b[-1] not in g:
... out.append((b,g))
...
>>> out
[('Jim', 'Bonnie'), ('Jim', 'Buffy'), ('Jeff', 'Bonnie')]
>>>
>>> b
'Jeff'
>>> g
'Buffy'
>>> out = []
>>> for b in boys:
... if b[-1] not in g:
... for g in girls:
... out.append((b,g))
...
>>> out
[('Jim', 'Bonnie'), ('Jim', 'Buffy')]
由于已定义了b
和g
并用上次运行的值填充,因此会发生以下情况:
- 第一个外环
。Jim
在m
中?否-运行内部循环:Buffy
- 追加
(吉姆,邦妮)
- 追加
(吉姆,巴菲)
- 第二外环
Jeff
在f
中?是-跳过内部循环李>Buffy
异常
:
>>> # b = g = None
>>> boys = 'Jim','Jeff'
>>> girls = 'Bonnie', 'Buffy'
>>>
>>> [(b,g) for b in boys if b[-1] not in g for g in girls]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
UnboundLocalError: local variable 'g' referenced before assignment
>#b=g=None
>>>男孩=‘吉姆’、‘杰夫’
>>>女孩=‘邦妮’、‘布菲’
>>>
>>>[(b,g)如果b[-1]不在g中表示在g中表示在女孩中表示b]
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第1行,在
UnboundLocalError:赋值前引用了局部变量“g”
我怀疑问题可能与优先级有关。帕伦斯解决了歧义并恢复了预期的行为吗?@BrianCain:这不是优先级,而是LC的结构。在第三种变体中,if
位于外循环,而不是内循环。