3

複数のイテラブルのリスト内包表記内で同一の条件ステートメントを配置すると結果に影響する理由を理解するのに苦労しています。

>>> 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 でこの質問に既に質問/回答している場合は、事前に謝罪してください。

4

1 に答える 1

3

あなたがしたことは次と同じです:

>>> 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')]

bgは既に定義されており、最後の実行からの値が入力されているため、次のことが起こります。

  • 最初の外側のループJim
    • mBuffy?いいえ - 内側のループを実行します:
    • 追加(Jim, Bonnie)
    • 追加(Jim, Buffy)
  • 2 番目の外側のループJeff
    • fBuffy?はい - 内部ループをスキップします。

これを最初に新しいPython シェルで実行した場合、次のエラーが発生しExceptionます。

>>> # 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
于 2012-09-23T04:42:58.760 に答える