4

この質問は、一部の人にとっては非常に簡単で明白かもしれませんが、何らかの理由でオンラインで答えを見つけることができませんでした. IDLE をいじくり回して、それがどのように機能するかを理解しようとしても、答えが見つかりませんでした。 複数のアイテムが指定されている場合、 forループはどのように機能しますか?

a = [1,2,3,4,5]
b = [6,7,8,9,0]
    for item in a and b:
        print 'why does this setup give the list b but nothing from a?'

フォローアップの質問:

1) ornotなどの他の演算子ではどうなるでしょうか?

2)これは適切な使用法ですか?もしそうなら、それは散らかったり、安全でなかったり、眉をひそめたりしていませんか?

4

6 に答える 6

5

したがって、次の 2 つのリストがあります。

>>> a = [1,2,3,4,5]
>>> b = [6,7,8,9,0]

...そして、 を反復したいa and b。では、正確に 何ですか?a and b

>>> a and b
[6, 7, 8, 9, 0]

奇妙に見えるかもしれませんが、これは Python に関する次の 2 つの事実の結果です。

  1. すべてのオブジェクトは、True-ish またはFalse-ish のいずれかです。例えば:

    >>> bool(a)
    True
    >>> bool(b)
    True
    

    実際、空のリストを除くすべてのリスト[]True-ish です。

  2. Python は短絡評価を使用します。これは、 に対してa and b、次のことを意味します。

    • -ish か-ishかどうかaをチェックしますTrueFalse

    • aFalse-ish の場合、次のように評価されますa

    • aTrue-ish の場合、次のように評価されますb

    a and bこれらのルールに従えば、あなたのケースで が と評価される理由を確認できるはずです[6, 7, 8, 9, 0](実際の値の組み合わせに対して同じルールに従うと、True短絡False評価が意味を成すことがわかります)。

実際にやりたいことが の項目を反復処理してから の項目を反復処理する場合は、演算子を使用してaそれらを連結できます。b+

>>> for item in a + b:
...     print item,
... 
1 2 3 4 5 6 7 8 9 0

フォローアップの質問について:

orやなどの他の演算子を使用するとどうなるでしょうnotか。

orの短絡評価のルールは異なり (自分で調べるか、上記のリンクをたどることができます)、あなたの場合は(つまり) とa or b評価されます。[1, 2, 3, 4, 5]a

notは常に-ish 値と -ish 値を返しTrueます。 orを反復できないため、 . が得られます。FalseFalseTrueTrueFalseTypeError

これは適切な使用法ですか?もしそうなら、それは散らかったり、安全でなかったり、眉をひそめたりしていませんか?

まあ、それについて違法なことは何もありませんが、ご覧のとおり、それはあなたが望むことをしません. (ab)短絡評価を使用して、反復するイテラブルを選択すると役立つ場合がありますが、これはその 1 つではありません。

于 2013-07-12T23:19:54.133 に答える
4

お気づきのとおり、複数のアイテムが指定されている場合、for ループは機能しません。あなたが得ているのは、a and b. a and b両方の項目が true の場合、繰り返しが True を返すことです。この場合、それが真であることを知っているので、それは右端のオペランドです。これを行う正しい方法は、itertools.chain を使用することです。

    for item in itertools.chain(a, b):
        print 'now we get both lists'
于 2013-07-12T23:07:19.943 に答える
1

これは、Python の英単語の使用が混乱を招く状況のようです。このステートメントは、「内のすべての項目を反復処理してから、for item in a and b内のすべての項目を反復処理する」という意味ではなく、評価者が「リストにand操作を適用したときに取得したリスト内のすべての項目を反復処理する」という意味ではありません。abab

だからあなたがしているのは後者です。2 つのリストaを論理積しbてから、結果をループしています。インタープリターで、andingab取得すると、

>>> a = [1,2,3,4,5]
>>> b = [6,7,8,9,0]
>>> a and b
[6, 7, 8, 9, 0]

もちろん、これはどの操作でも実行できますが、forループの前に適用されるだけです。

and両方のリストを順番にループするには、操作を aに置き換えて、+それらをまとめて連結します。このような

>>> a + b
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> for item in a + b:
...     print item,
... 
1 2 3 4 5 6 7 8 9 0
于 2013-07-12T23:07:12.447 に答える
1

コードa and bは 2 つのリストを結合せず、論理 AND 演算を実行します。リストなど、2 つの真の値の論理 AND は、2 番目の引数の値に評価されます。or 演算子を使用すると、false 以外の最初の値として評価されます。not を使用すると、真でない値の場合は True に評価され、真の値の場合は False に評価されます。通常、and または or の値をブール値以外として使用することは嫌われます。

やろうとしていることを達成するには、いくつかの方法があります。最も簡単なのはループオーバーa + bです。これにより、新しいリストが得られます。リストが大きい場合は、itertools.chain()の使用を検討してください。これにより、新しいリスト オブジェクトを作成せずにすべての値をループできます。

于 2013-07-12T23:14:08.397 に答える
0

次のこともできます。

for i in a + b:
    print i

これにより、2 つのリストが結合され、反復処理が可能になります。

于 2013-07-12T23:19:58.253 に答える
0

a and bbの両方が空でないか、または の場合に与えます。Python シェルで入力してみてください。abNone01 and 2

試す:

a = [1,2,3,4,5]
b = [6,7,8,9,0]
for item in a + b:
    print item

+演算子を使用してリストを連結できます。

于 2013-07-12T23:08:41.907 に答える