質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

1回答

1443閲覧

n-gram関数の中身がわからない

umimarine

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

0クリップ

投稿2021/07/09 04:02

https://qiita.com/yamaru/items/6d66445dbd5e7cef8640
にあります、

  1. n-gram

与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,”I am an NLPer”という文から単語bi-gram,文字bi-gramを得よ.
ここでは、[lst[i:] for i in range(n)]で、1要素目始まり、2要素目始まり、…、n要素目始まりの要素列のリストを作成し、それらをzip関数に渡して前から順番に要素を抽出することで、連続するn要素からなる組を作っています。
なお、[lst[i:] for i in range(n)]の結果は1つのリストであるため、前に*をつけることでリストを展開し、それぞれの要素列に分けた上でzip関数に渡す必要があります。

なのですが、

Python3

1 2def ngram(n, lst): 3 # ex. 4 # [str[i:] for i in range(2)] -> ['I am an NLPer', ' am an NLPer'] 5 # zip(*[str[i:] for i in range(2)]) -> zip('I am an NLPer', ' am an NLPer') 6 return list(zip(*[lst[i:] for i in range(n)])) 7 8str = 'I am an NLPer' 9words_bi_gram = ngram(2, str.split()) 10chars_bi_gram = ngram(2, str) 11 12print('単語bi-gram:', words_bi_gram) 13print('文字bi-gram:', chars_bi_gram) 14 15#結果 16 17単語bi-gram: [('am', 'an'), ('I', 'am'), ('an', 'NLPer')] 18文字bi-gram: [('I', ' '), (' ', 'N'), ('e', 'r'), ('a', 'm'), (' ', 'a'), ('n', ' '), ('L', 'P'), ('m', ' '), ('P', 'e'), ('N', 'L'), ('a', 'n')] 19

となっているのですが、

Python3

1[lst[i:] for i in range(n)]

で[1要素目始まり、2要素目始まり、3要素目始まり、...]
というリストが得られるのはわかるのですが、
なぜ最後nの数の中身になっている(n=2ならば、```
[('am', 'an'), ('I', 'am'), ('an', 'NLPer')]

zip の仕様なのか、*の仕様なのかはわからないのですが、 詳しく教えていただけませんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

中身がn個になる理由は、zipにn個のリストを渡しているためです。

zipは渡したリストの各要素を順番に取り出して連結しますので、2つのリストを指定すれば中身は2個ずつになり、3つのリストを指定すれば中身は3個ずつになります。

python:

1list1=['a1','a2','a3'] 2list2=['b1','b2','b3'] 3list3=['c1','c2','c3'] 4 5print(list(zip(list1, list2))) # 2つのリストを指定した場合 6# -> [('a1', 'b1'), ('a2', 'b2'), ('a3', 'b3')] 7 8print(list(zip(list1, list2, list3))) # 3つのリストを指定した場合 9# -> [('a1', 'b1', 'c1'), ('a2', 'b2', 'c2'), ('a3', 'b3', 'c3')]

投稿2021/07/09 04:35

segavvy

総合スコア958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問