リスト内包表記を使用してタプルのリストを作成するのに括弧が必要なのはなぜですか?


8

関数型プログラミングHOWTOで述べたように、リスト内包表記を使用してタプルのリストを作成するには、括弧を使用する必要があります。特に、これは次の引用のドキュメントで表現されます。

Pythonの文法に曖昧さを導入しないようにするに は、がタプルを作成している場合は、括弧で囲む必要があります。

したがって、例として:

[x, y for x in seq1 for y in seq2]  # This is a syntex error
[(x, y) for x in seq1 for y in seq2]  # This is a correct expression of list of tuples using list comprehension

リスト内包表記を使用してタプルのリストを表現する際に括弧の使用を強制することにより、どのあいまいさを回避できますか?


1
@Georgy:残念ながら、その質問に対する現在受け入れられている答えは間違っています。(それが確認を見つける前に私が推測したものですが、それでも間違っています。)
user2357112は、モニカ

リスト内包表記のタプルに括弧が必要なのはなぜですか?も参照してください、@ user2357112が参照する不正解があります。
John Kugelman

回答:


9

たくさんのメーリングリストを掘り下げた後、私はパーサーがそれで大丈夫だというかなり明白なステートメントを見つけました。括弧は、意味を明確にするために必須にされました。2000年にpython-devメーリングリストでGuido が引用した引用は次のとおりです。

心配しないで。Greg Ewingは、これをPython独自の文法で問題なく表現しました。これは、パーサーが来るのと同じくらい制限されています。(これはLL(1)であり、1つの先読みトークンを持つ純粋な再帰的​​下降に相当します。つまり、バックトラッキングはありません。)

ここにグレッグの文法があります:

atom: ... | '[' [testlist [list_iter]] ']' | ...
  list_iter: list_for | list_if
  list_for: 'for' exprlist 'in' testlist [list_iter]
  list_if: 'if' test [list_iter]

以前は、リストの構文はでした'[' [testlist] ']'。別の言葉で説明しましょう:

パーサーは、一連のコンマ区切りの式を解析します。以前は、これに']'続く唯一の可能なトークンとして期待されていました。変更後、'for'次のトークンが考えられます。これは、一致する括弧を解析する方法を知っているどのパーサーにとってもまったく問題ありません!

[x, y for ...](パーサーではなく人間の読者にとって)あいまいであるためにサポートしたくない場合は、文法を次のように変更できます。

'[' test [',' testlist | list_iter] ']'

|連結よりもバインドが少なく[...]、オプションの部分を意味することに注意してください。)

Greg Ewingが実行するスレッドの次の応答も参照してください

>>> seq = [1,2,3,4,5]
>>> [x, x*2 for x in seq]
[(1, 2), (2, 4), (3, 6), (4, 8), (5, 10)]

リスト理解パッチの初期のバージョンでは、それはうまくいきます。


-1

ドキュメントから:

ご覧のとおり、出力ではタプルは常に括弧で囲まれているため、ネストされたタプルは正しく解釈されます。(タプルがより大きな式の一部である場合は)とにかく括弧が必要な場合が多いですが、括弧で囲むことも括弧なしで入力することもできます。タプルの個々の項目に割り当てることはできませんが、リストなどの変更可能なオブジェクトを含むタプルを作成することは可能です。

リスト内では、内包タプルがリスト内にネストされます。したがって、括弧で囲む必要があります。ただし、ネストされthe_tuples = 'a','b','c'ていない場合、たとえば、自動的にタプルとして認識されるため、必要ありません。


-2

Pythonには、オプションの括弧を含むいくつかの構文要素があります。この場合、これらは次のとおりです。

  • tuple リテラル x, y
  • ジェネレータ式 y for x in seq1 for y in seq2

明確なケースでは、これらは追加の括弧なしで使用できます。

  • b = x, y
  • sum(y for x in seq1 for y in seq2)

ただし、同じ式で両方を使用することはあいまいです。意味を明確にするために括弧が必要です:

  • [(x, y) for x in seq1 for y in seq2]
  • [x, (y for x in seq1 for y in seq2)]

python3文法に従って、リスト表示を[...]含むものとして定義されているいずれかの式のリストa, b, *c, dまたは理解をa for a in b)。


1
この構文が導入された当時、ジェネレータ式は存在しませんでした。
user2357112はモニカ

@ user2357112supportsMonicaそれでも、あいまいさが存在することは変わりません。
MisterMiyagi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.