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

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

ただいまの
回答率

88.34%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 280

HaTea

score 16

前提・実現したいこと

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

該当のソースコード

#野球ポイントプログラム
#set_pointリストはヒットを格納
set_point =[]
con_set = []
#numはヒットで1、ツーベースで2、スリーベースで3
#num2はホームラン
def num_point(num,num2):
    point = 0
    if num2 == 0:
        set_point.append(num)
        new_set = list(map(lambda x: x+num, set_point[:-1]))
        new_set.append(num)
#関数外でないといけ無いのでcon_setに1度格納
        for row in new_set:
            con_set.append(row)
            for row in con_set:
#リスト内から4以上の数字を消し、消した数をpointに点数
                 if row >= 4:
                    con_set.remove(row)
                    point += 1
                    return point
                 else:
                    return point
#ホームランの場合
    elif num2 >= 1:
        point = len(con_set) + point + 1
        if len(con_set) >= 1:
            set_point.clear()
            con_set.clear()
            return point
        else:
            return point



print(num_point(1,0))
print(con_set)

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

python3.7

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • LouiS0616

    2020/06/15 14:16

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

    キャンセル

  • HaTea

    2020/06/15 19:33

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

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

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

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

import itertools

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

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

組んでみた

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

# bは塁打。ホームランも4塁打として扱えば良い。
def hit(base_state, b):
    # どの塁までランナーが到達したか。3塁のあとは4塁,5塁と突き進む。
    new_state = [b]
    for e in base_state:
        new_state.append(e+b)

    # print(new_state)

    # 4塁を超えたランナーをホームインさせる。
    ret = []
    point = 0
    for e in new_state:
        if e < 4:
            ret.append(e)
        else:
            point += 1

    # ベース上の状況と、今の打席の点数を返す。
    return ret, point


# 2塁打、単打、3塁打、単打、単打、本塁打、本塁打、2塁打
h = [2, 1, 3, 1, 1, 4, 4, 2]
# 最初はランナーなし。
state = []

for e in h:
    print('-'*16)
    if not state:
        print('ランナーなし')
    else:
        print(f'ただいまランナー{state}塁')

    print(f'{e}塁打!')
    state, point = hit(state, e)    # 塁上の状況の更新。
    print(f'{point}点入りました')

print(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 21:02

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

    キャンセル

  • 2020/06/15 21:11

    すみません。最後まで見ていませんでした。
    上のQは消しておきます。

    即日に回答して下さりありがとうございました。
    とても助かりました!

    キャンセル

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

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る