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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

Q&A

解決済

1回答

864閲覧

リスト内全体に追加される数値を足す方法について

HaTea

総合スコア16

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

0グッド

0クリップ

投稿2020/06/15 04:51

前提・実現したいこと

野球の点数のプログラムを作ろうとしているのですが、リスト内全体に追加される数値を足す方法が
思考錯誤しても出来ません。リスト2つ目までは上手くいくのですが...。
(現状)ヒット、ヒット、ヒットの場合リストに格納される数[1,2,2]
例 ヒット、ヒット、ヒットの場合リストに格納される数は[1,2,3]にしたい。

該当のソースコード

python

1#野球ポイントプログラム 2#set_pointリストはヒットを格納 3set_point =[] 4con_set = [] 5#numはヒットで1、ツーベースで2、スリーベースで3 6#num2はホームラン 7def num_point(num,num2): 8 point = 0 9 if num2 == 0: 10 set_point.append(num) 11 new_set = list(map(lambda x: x+num, set_point[:-1])) 12 new_set.append(num) 13#関数外でないといけ無いのでcon_setに1度格納 14 for row in new_set: 15 con_set.append(row) 16 for row in con_set: 17#リスト内から4以上の数字を消し、消した数をpointに点数 18 if row >= 4: 19 con_set.remove(row) 20 point += 1 21 return point 22 else: 23 return point 24#ホームランの場合 25 elif num2 >= 1: 26 point = len(con_set) + point + 1 27 if len(con_set) >= 1: 28 set_point.clear() 29 con_set.clear() 30 return point 31 else: 32 return point 33 34 35 36print(num_point(1,0)) 37print(con_set)

補足情報(FW/ツールのバージョンなど)

python3.7

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

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

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

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

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

LouiS0616

2020/06/15 05:16

例えば三本連続して単打が出たときset_pointは[1, 1, 1]になっていますが、これは想定通りですか?
HaTea

2020/06/15 10:33

set_pointのリストは想定通りです。 com_setのリストで処理しようとしています。
guest

回答1

0

ベストアンサー

set_pointのリストは想定通りです。

なるほど、それならば間違っている箇所がはっきり分かります。

Python

new_set = list(map(lambda x: x+num, set_point[:-1]))

[1, 1, 1] を [1, 2, 3] にしたいならば、各要素の累積和を出さねばなりません。
しかし上記のコードでは、各要素にnumを足しているだけです。

累積和は例えばitertools.accumulateを用いて求めることができます。

Python

1import itertools 2 3src = [1, 1, 1] 4dst = list(itertools.accumulate(src)) 5print(dst) # => [1, 2, 3]

実際に差し替えて試してみて下さい。

組んでみた

組んでみました。
雑ですけれど、グローバル変数を利用しないで実現できる例です。参考までに。

Python

1# bは塁打。ホームランも4塁打として扱えば良い。 2def hit(base_state, b): 3 # どの塁までランナーが到達したか。3塁のあとは4塁,5塁と突き進む。 4 new_state = [b] 5 for e in base_state: 6 new_state.append(e+b) 7 8 # print(new_state) 9 10 # 4塁を超えたランナーをホームインさせる。 11 ret = [] 12 point = 0 13 for e in new_state: 14 if e < 4: 15 ret.append(e) 16 else: 17 point += 1 18 19 # ベース上の状況と、今の打席の点数を返す。 20 return ret, point 21 22 23# 2塁打、単打、3塁打、単打、単打、本塁打、本塁打、2塁打 24h = [2, 1, 3, 1, 1, 4, 4, 2] 25# 最初はランナーなし。 26state = [] 27 28for e in h: 29 print('-'*16) 30 if not state: 31 print('ランナーなし') 32 else: 33 print(f'ただいまランナー{state}塁') 34 35 print(f'{e}塁打!') 36 state, point = hit(state, e) # 塁上の状況の更新。 37 print(f'{point}点入りました') 38 39print(f'残塁は{state}です。')

実行結果 Wandbox

---------------- ランナーなし 2塁打! 0点入りました ---------------- ただいまランナー[2]塁 1塁打! 0点入りました ---------------- ただいまランナー[1, 3]塁 3塁打! 2点入りました ---------------- ただいまランナー[3]塁 1塁打! 1点入りました ---------------- ただいまランナー[1]塁 1塁打! 0点入りました ---------------- ただいまランナー[1, 2]塁 4塁打! 3点入りました ---------------- ランナーなし 4塁打! 1点入りました ---------------- ランナーなし 2塁打! 0点入りました 残塁は[2]です。

投稿2020/06/15 10:58

編集2020/06/15 11:30
LouiS0616

総合スコア35668

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

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

HaTea

2020/06/15 12:02

累積和の場合、単打→二塁打→三塁打の場合リストは[1, 3, 6]になってしまい4以上になるのは1つだけなのでpointは1になってしまいます。 上記の場合、実現したいのは[1+2+3, 2+3, 3] の様な[6, 5, 3]形です。
HaTea

2020/06/15 12:11

すみません。最後まで見ていませんでした。 上のQは消しておきます。 即日に回答して下さりありがとうございました。 とても助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問