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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

5回答

874閲覧

配列の中に、別の配列と同じ並びの組み合わせがいくつあるかカウントしたいです

dkito

総合スコア13

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/11/28 02:28

前提・実現したいこと

配列の中に、別の配列と同じ並びの組み合わせがいくつあるかカウントしたいです。例えば、

python

1list_1 = ['a','b','c','d','e','a','b','c'] 2list_2 = ['a','b','c'] 3

という配列がある時に、list_1の中にlist_2の配列の並び'a','b','c'が二つあるので二つカウントするというものです。
また、

python

1list_1 = ['a','a','a'] 2list_2 = ['a','a'] 3

この場合、list_1の中に'a','a'という連続した値の組み合わせはlist_1[0]とlist_1[1]、list_1[1]とlist_1[2]があるので二つカウントしたいです。
list_1[0]とlist_1[2]の組み合わせはlist_2と同じように連続していないのでカウントしません。

説明が分かりづらくてすみません。

配列の中に配列が含まれているかを比べる方法(?)を調べてみたのですが、配列の中にある値が含まれているか確認する方法ばかりで思うような方法が見つかりませんでした。

どうかよろしくお願いします。

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

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

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

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

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

guest

回答5

0

ベストアンサー

以下です。

例1

python

1>>> list_1 = ['a','b','c','d','e','a','b','c'] 2>>> list_2 = ['a','b','c'] 3>>> 4>>> len2 = len(list_2) 5>>> print(len([list_1[i:i+len2] for i in range(len(list_1)) if list_1[i:i+len2]==list_2])) 62

例2

python

1>>> list_1 = ['a','a','a','a','a'] 2>>> list_2 = ['a','a'] 3>>> 4>>> len2 = len(list_2) 5>>> print(len([list_1[i:i+len2] for i in range(len(list_1)) if list_1[i:i+len2]==list_2])) 64

投稿2021/11/28 03:09

ppaul

総合スコア24670

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

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

dkito

2021/11/28 03:56

回答ありがとうございます。 このように実装すればいいのですね。 勉強になりました。
guest

0

python

1list_1 = ['a','b','c','d','e','a','b','c'] 2list_2 = ['a','b','c'] 3 4print(sum( 5 [list_1[i:i+len(list_2)] == list_2 for i in range(len(list_1)-len(list_2)+1)])) 6 7# 82 9 10list_1 = ['a','a','a'] 11list_2 = ['a','a'] 12 13print(sum( 14 [list_1[i:i+len(list_2)] == list_2 for i in range(len(list_1)-len(list_2)+1)])) 15 16# 172
~~~import re

list_1

1~~~list_2 = ['a','b','c']~~~ 2 3~~~str_1, str_2 = '\0'.join(list_1), '\0'.join(list_2)~~~ 4~~~print(len(re.findall(rf'(?={str_2})', str_1)))~~~
~~~2~~~ ~~~list_1 = ['a','a','a']~~~ ~~~list_2 = ['a','a']~~~ ~~~str_1, str_2 = '\0'.join(list_1), '\0'.join(list_2)~~~ ~~~print(len(re.findall(rf'(?={str_2})', str_1)))~~~
~~~2~~~ ~~~```~~~

投稿2021/11/28 02:59

編集2021/11/28 06:33
melian

総合スコア20655

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

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

退会済みユーザー

退会済みユーザー

2021/11/28 03:12

文字列として結合してしまうと list_1 = ['a', 'bc', 'abc'] みたいなケースでも誤マッチしてしまうので、良くないと思います。
melian

2021/11/28 03:15

確かに。それでは `\0` で結合しましょう。
melian

2021/11/28 03:48

`\0` 結合でも誤判定が出るケースがあるので全体的に書き直しました。
guest

0

とくに速度など気にせず素直に組むと以下のような感じでできます。

Python

1list_1 = ['a','b','c','d','e','a','b','c'] 2list_2 = ['a','b','c'] 3 4L1, L2 = len(list_1), len(list_2) 5cnt = 0 6for i in range(L1-L2+1): 7 if list_2 == list_1[i:L2+i]: 8 cnt += 1 9print(cnt)

投稿2021/11/28 02:57

can110

総合スコア38341

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

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

0

こんな感じで書けます。

Python

1cnt = 0 2for i, _ in enumerate(list_1): 3 sublist = list_1[i:i+len(list_2)] 4 cnt += sublist == list_2 5 6print(cnt)

投稿2021/11/28 02:51

LouiS0616

総合スコア35668

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

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

0

多分、泥臭い方法(C言語風味)しかないかなと。シンプルに書ける方法は無いと思います。(調べても、出てこないのなら)

プログラミングというのは「現実世界のシミュレーション」です。なので一旦、Pythonでどう書くかとかは置いといて、現実世界で考えてみましょう。

もし、abcdabcという文字列に abcという文字列がいくつ含まれているかを考えてみてください。
普通に考えると、abcを基準に考えるだけだと思います。

最初にabcdabcの先端にabcを合わせて、

abcdabc abc

abcと同じかどうか調べる。aもbもcも一致しているので、カウントアップ。(つまり 一個目)

さらに右に 1ずらず。つまり先頭が0番目なら1番目にずらす。
そして同様に調べる。

abcdabc abc

'b' == 'a'の時点でfalse, つまり条件を満たさないのでカウントアップはしない
で、同じく右に一つずらす。さらに同じかどうかを調べていく。

abcdabc abc

…と最後までやると、「二個」となるはずです。

これを実装すればいいだけです。

上記は文字列としてやりましたが、今回の場合はそれをリストと見なせばいいだけです。

投稿2021/11/28 02:44

編集2021/11/28 02:46
BeatStar

総合スコア4962

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問