pythonで配列を与えたら

長さがN以上あったら配列の長さをNで打ち切り
Nに足りなかったら配列をそこまで伸ばして伸ばした分を0で埋める
という関数をどう書いたらいいでしょうか

回答の条件
  • 1人2回まで
  • 登録:2016/03/17 16:46:06
  • 終了:2016/03/23 19:00:54

ベストアンサー

id:quintia No.2

quintia回答回数556ベストアンサー獲得回数672016/03/17 21:59:14

ポイント50pt

リストの複製を作ってよくて、nがそれほど大きくない(サイズが何十万とか何百万とかではない)なら、

def adjust_list(l, n):
  return (l + [0] * n)[:n]

で十分だと思います。

実用上は関数化する必要もなく

l = (l + [0] * n)[:n]

で十分でしょう。

関数化しないといけないほど色んな所から呼ばれるとか、上の書き方での無駄な処理が気になるとか、そんな状況ならリストを頻繁に伸縮しなければならないロジックの方をどうにかする方が健全だと思うので。

その他の回答(1件)

id:a-kuma3 No.1

a-kuma3回答回数4365ベストアンサー獲得回数18012016/03/17 17:16:11

ポイント50pt

ベタな書き方ですが、こんな感じで。

def adjust_list(list, n):
    ret = list[:]
    if len(ret) < n:
        ret += [0] * (n - len(ret))
    elif len(ret) > n:
        ret[n:] = []
    return ret


# test
list = [1, 2, 3, 4, 5]
print list
print adjust_list(list, 3)
print adjust_list(list, 8)
print adjust_list(list, 5)

引数で渡したリストを破壊せずに、長さを変更したリストを関数の戻り値にしてます。
もし、引数で渡したリスト自体を変更するのであれば、こんな感じで。

def adjust_list(list, n):
    if len(list) < n:
        list += [0] * (n - len(list))
    elif len(list) > n:
        list[n:] = []
id:quintia No.2

quintia回答回数556ベストアンサー獲得回数672016/03/17 21:59:14ここでベストアンサー

ポイント50pt

リストの複製を作ってよくて、nがそれほど大きくない(サイズが何十万とか何百万とかではない)なら、

def adjust_list(l, n):
  return (l + [0] * n)[:n]

で十分だと思います。

実用上は関数化する必要もなく

l = (l + [0] * n)[:n]

で十分でしょう。

関数化しないといけないほど色んな所から呼ばれるとか、上の書き方での無駄な処理が気になるとか、そんな状況ならリストを頻繁に伸縮しなければならないロジックの方をどうにかする方が健全だと思うので。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません