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

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

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

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

Q&A

解決済

7回答

443閲覧

pythonのlistの操作

konnitiha2

総合スコア30

Python 3.x

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

0グッド

0クリップ

投稿2020/10/26 13:46

今、pythonの勉強をしている学生です。
どうしてもわからない問題があるので回答よろしくお願いします。
下記のようなlistの例があった時、①②のような操作を行いたいです。

①()内の左の要素が連続する場合後ろの要素を抜き出したい
ー>例えば,(33, 695), (34, 685)の場合、(34,685)を抽出したいということです
②前後ともに連続しない(孤立している)場合も、抜き出したい
ー>例えば、listの例では(132, 737)がそれに該当します。

理想的な回答としては
[(34, 685), (132, 737), (229, 674), (328, 704)]
となることです。

listの例
[(33, 695), (34, 685), (132, 737), (228, 688), (229, 674), (327, 684), (328, 704)]

今は下記プログラムのように連続した場合、後ろを抽出するプログラムを何とか書けたところです。②で詰まっています。
非常に汚いコードで申し訳ないです。
lの長さは本来もっと長いことを想定しています。

python

1cnt = 0 2k = 0 3a = [] 4final = [] 5l = [(33, 695), (34, 685), (132, 737), (228, 688), (229, 674), (327, 684), (328, 704)] 6 7for i in l: 8 if cnt == 0: 9 a.append(i) 10 else: 11 if i[0] - a[k][0] < 2: 12 final.append(i) 13 a.append(i) 14 else: 15 a.append(i) 16 k += 1 17 cnt += 1
[(34, 685), (229, 674), (328, 704)]

宜しくお願い致します。

環境
Windows 10
python 3.7

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

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

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

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

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

guest

回答7

0

素晴らしい解決方法をありがとうございました

投稿2020/11/05 02:57

konnitiha2

総合スコア30

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

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

0

わかりやすい解答ありがとうございます

投稿2020/11/05 02:56

konnitiha2

総合スコア30

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

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

0

ベストアンサー

前の項の値との差の list を作り、それをつかって残す項を調べるjという方法でかいてみました。
いろいろな場合の例のテストもしてみています。

python3

1def runlength_tail(l): 2 if not l or len(l) == 0: 3 return l 4 5 l_keys = [x[0] for x in l] 6 diffs = [0] + [l_keys[i + 1] - l_keys[i] for i in range(0, len(l_keys) - 1)] + [0] 7 # print(diffs) 8 return [l[i] for i in range(0, len(diffs) - 1) if (diffs[i + 1] != 1)] 9 10l = [ 11 (33, 695), (34, 685), 12 (132, 737), 13 (228, 688), (229, 674), 14 (327, 684), (328, 704) 15] 16print(runlength_tail(l)) 17 18l = None 19print(l, " -> ", runlength_tail(l)) 20l = [(1, 1)] 21print(l, " -> ", runlength_tail(l)) 22l = [(1, 1), (2, 2)] 23print(l, " -> ", runlength_tail(l)) 24l = [(1, 1), (2, 2), (3, 3)] 25print(l, " -> ", runlength_tail(l)) 26l = [(1, 1), (3, 3), (5, 5)] 27print(l, " -> ", runlength_tail(l)) 28l = [(1, 1), (2, 2), (5, 5)] 29print(l, " -> ", runlength_tail(l)) 30l = [(1, 1), (4, 4), (5, 5)] 31print(l, " -> ", runlength_tail(l)) 32l = [(1, 1), (2, 2), (3, 3), 33 (5, 5), (6, 7), (7, 7), 34 (9, 9), (10, 10), (11, 11)] 35print(l, " -> ", runlength_tail(l)) 36l = [(1, 1), (2, 2), (3, 3), 37 (5, 5), (6, 7), (7, 7), 38 (9, 9), 39 (11, 11), (12, 12), (13, 13)] 40print(l, " -> ", runlength_tail(l))

実行例
イメージ説明

投稿2020/10/27 12:18

編集2020/11/05 11:17
katoy

総合スコア22324

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

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

0

以下のようなアプローチではどうでしょうか。

リストから連続する3つの要素を取り出して、左側から順に left, center, right と名前を付けます。
条件①は、left[0] + 1 == center[0] のときcenterを抜き出す
条件②は、left[0] + 1 != center[0] かつ center[0] +1 != right[0] のときcenterを抜き出す
として処理します。
3つの要素を取り出す窓を1つずつ後ろへずらしていけば、リストの最後まで処理できます。

python

1l = [(32, 123), (33, 695), (34, 685), (132, 737), (228, 688), (229, 674), 2 (327, 684), (328, 704), (500, 5), (699, 6), (700, 7)] 3 4res = [] 5for left, center, right in zip(l, l[1:], l[2:]+[l[-1]]): 6 if (left[0]+1 == center[0]) or (left[0]+1 != center[0] and center[0]+1 != right[0]): 7 res.append(center) 8print(res) # [(33, 695), (34, 685), (132, 737), (229, 674), (328, 704), (500, 5), (700, 7)]

投稿2020/10/26 14:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

逆から処理すれば簡単に書けます。

Python

1l = [(33, 695), (34, 685), (132, 737), (228, 688), 2 (229, 674), (327, 684), (328, 704)] 3 4final = [] 5k = None 6for i in reversed(l): 7 if i[0]+1 != k: 8 final.insert(0,i) 9 k = i[0] 10 11print(final)

元のコードのaの位置づけが分からないので無視しました。

と思ったけど、lが非常に長いということであれば、逆順に並べ替えるコストが気になるので、添え字を使うのでしょうか。

Python

1for i in range(len(l)-1, -1, -1): 2 if l[i][0]+1 != k: 3 final.insert(0,l[i]) 4 k = l[i][0]

投稿2020/10/26 14:33

otn

総合スコア84790

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

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

otn

2020/10/26 14:41

そうか、添え字使ったら、前からやるのとあまり変わらないですね。
otn

2020/10/26 14:58

こういうのは、Rubyが得意です。 l = [[33, 695], [34, 685], [132, 737], [228, 688], [229, 674], [327, 684], [328, 704]] final = l.chunk_while{|x,y| x[0]+1==y[0]}.map(&:last) p final
guest

0

Python

1lst = [(33, 695), (34, 685), (132, 737), (228, 688), (229, 674), (327, 684), (328, 704)] 2# 念のため最初の要素でソートします。 3lst = sorted(lst, key=lambda x: x[0]) 4lstN = [s for i, s in enumerate(lst) if i == len(lst)-1 or s[0]+1 != lst[i+1][0]] 5print(lstN) # [(34, 685), (132, 737), (229, 674), (328, 704)]

投稿2020/10/26 14:19

lehshell

総合スコア1147

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

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

0

外部のコードサイトで書いたのでお手数ですがそちら見てください
repl.it

こんな感じでいいんでしょうか

投稿2020/10/26 14:04

sk-sora--ypi

総合スコア530

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問