Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在具有多个iterable的python列表理解中定位条件语句_Python_List Comprehension - Fatal编程技术网

在具有多个iterable的python列表理解中定位条件语句

在具有多个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

我很难理解,为什么在多个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', '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
      中?是-跳过内部循环
如果您首先在一个新的Python shell中运行此命令,它将引发一个
异常

>>> # 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
位于外循环,而不是内循环。