📘

配列処理の問題集(Python)

2022/07/19に公開

はじめに

過去にJavaScriptDartで配列処理の問題集を作成しました。(JS,Dart)
今回はPythonによる配列処理の問題を作成しました。

是非、paiza.IOやお使いのエディタで解答なさってください

筆者自身Pythonを学習し始めて半月程度であるため、至らない点や冗長な処理などあると思います。その際はコメント欄にて教えてもらえると幸いです🙇‍♂️

また自分への忘却録としてメモを残します。

忘却録
  • pythonではオブジェクトリテラルは辞書型と呼ばれる
  • JSでいうnullに対応するのがNone
  • 辞書型のkeyはstring型 or int型のみでstring型の場合はキャメルケース
  • 辞書型のkeyが存在するかはget()で判定する
  • pythonにはリスト・辞書型・Set・ジェネレーターの作成に内包記法がある(めっちゃ便利。。。)
  • JSでいうmap,filterなどのメソッドはなく、内包記法で作成する
  • reduceはfunctoolsをインポートすれば使用できる
  • JSでいうeveryメソッドはall()でラップすることで同様の機能をなす

問題①

1から100までの数字が格納された List の作成をして下さい。

解答
list = [index + 1 for index in range(100)]
print(list)

問題②

次の連想配列(images)のheightだけを取得し、新しい配列(heights)を作成して下さい。

images = [
    {"Height": "20px", "Width": "40px"},
    {"Height": "34px", "Width": "56px"},
    {"Height": "28px", "Width": "64px"},
]
解答
heights = [{"height": i["Height"]} for i in images]
print(heights) # [{'Height': '20px'}, {'Height': '34px'}, {'Height': '28px'}]

問題③

次の連想配列(member)の中から名前(name)の値だけを抜き取った配列が返るような関数getNameを作成して下さい。

members = [
    {"Name": "松井", "Age": 39, "Gender": "male"},
    {"Name": "今田", "Age": 34, "Gender": "female"},
    {"Name": "鈴木", "Age": 24, "Gender": "male"},
    {"Name": "山田", "Age": 56, "Gender": "male"},
    {"Name": "田中", "Age": 89, "Gender": "female"},
]
解答
getName = [i["Name"] for i in members]
print(getName) # ['松井', '今田', '鈴木', '山田', '田中']

問題④

以下の連想配列(users)の中から、管理者権限(admin)を持っている(true)ユーザーに絞り込み、filteredUsersという変数に格納して下さい。

users = [
    {"Id": 1, "Admin": True},
    {"Id": 2, "Admin": True},
    {"Id": 3, "Admin": False},
    {"Id": 4, "Admin": True},
    {"Id": 5, "Admin": False},
]
解答
filteredUsers = [user for user in users if user["Admin"]]
print(filteredUsers) # [{'Id': 1, 'Admin': True}, {'Id': 2, 'Admin': True}, {'Id': 4, 'Admin': True}]

問題⑤

次の多次元配列のインデックス0番目のみを取り出した配列を作成して下さい。

array = [
    ["Ruffy", "captain"],
    ["Zoro", "combatant"],
]
解答
arrayIndex0 = [i[0] for i in array]
print(arrayIndex0) # ['Ruffy', 'Zoro']

問題⑥

次の多次元配列の0番目の配列のみを取り出し新しい配列に作成して下さい。

array = [
    ["Ruffy", "captain"],
    ["Zoro", "combatant"],
]
解答
arrayIndex0 = [i for i in array]
print(arrayIndex0[0]) # ['Ruffy', 'captain']

問題⑦

次の連想配列(member)の中から35歳以上の名前(name)の値だけを抜き取った配列が返るような関数getNameOver35を作成して下さい。

members = [
    {"Name": "松井", "Age": 39, "Gender": "male"},
    {"Name": "今田", "Age": 34, "Gender": "female"},
    {"Name": "鈴木", "Age": 24, "Gender": "male"},
    {"Name": "山田", "Age": 56, "Gender": "male"},
    {"Name": "田中", "Age": 89, "Gender": "female"},
]
解答
getNameOver35 = [member["Name"] for member in members if member["Age"] >= 35]

print(getNameOver35) # ['松井', '山田', '田中']

問題⑧

以下のような重複値を含む配列arrの中から、重複値を除く互いに素な配列を作成して下さい。

arr = [2, 4, 7, 5, 4]
解答
coprimeArr = list(set(arr))
print(coprimeArr) # [2, 4, 5, 7]

問題⑨

次の連想配列の中からnameプロパティをもったユーザーに絞り込み、getNameという変数に格納して下さい。

users = [
    {"Id": 1, "Name": "豊臣"},
    {"Id": 2},
    {"Id": 3, "Name": "織田"},
]
解答
getName = [user for user in users if user.get("Name")]
print(getName) # [{'Id': 1, 'Name': '豊臣'}, {'Id': 3, 'Name': '織田'}]

問題⑩

以下の連想配列(users)の中から、管理者権限(admin)を持っている(true)ユーザーを探し、最初に見つけた(true)ユーザーをadminという変数に格納して下さい。

users = [
    {"Id": 1, "Admin": False},
    {"Id": 2, "Admin": True},
    {"Id": 3, "Admin": False},
    {"Id": 4, "Admin": True},
]
解答
user_generator = (user for user in users if user["Admin"])
print(next(user_generator)) # {'Id': 2, 'Admin': True}

問題⑪

次の連想配列(member)の中から,田中さんのオブジェクトを抽出するfindTanakaという関数を作成して下さい。

members = [
    {"Name": "松井", "Age": 39, "Gender": "male"},
    {"Name": "今田", "Age": 34, "Gender": "female"},
    {"Name": "鈴木", "Age": 24, "Gender": "male"},
    {"Name": "山田", "Age": 56, "Gender": "male"},
    {"Name": "田中", "Age": 89, "Gender": "female"},
]
解答
def find(pred, iterable):
    for element in iterable:
        if pred(element):
            return element
    return None


print(find(lambda x: x.get("Name") == "田中", members)) # {'Name': '田中', 'Age': 89, 'Gender': 'female'}

問題⑫

アンケートを実施した結果がusersという連想配列に格納されています。ユーザー全員が回答済みかどうかを確認し、hasSubmitted変数に結果(TrueかFalse)を示して下さい。

expect: False

users = [
    {"Id": 2, "HasSubmitted": True},
    {"Id": 3, "HasSubmitted": False},
    {"Id": 4, "HasSubmitted": True},
]
解答
hasSubmitted = all(user["HasSubmitted"] for user in users)
print(hasSubmitted) # False

問題⑬

次のtripという連想配列に格納されたdistanceの合計を求めて、totalDistanceという変数に格納して下さい。

trips = [{"Distance": 34}, {"Distance": 12}, {"Distance": 1}]
解答
from functools import reduce
totalDistance = reduce((lambda x, y: x + y),
                       [trip["Distance"] for trip in trips])

print(totalDistance) # 47

問題⑭

次の変数engineersに格納されたエンジニアの種類(フロントエンド、バックエンド)の数を種類を集計し、一つのオブジェクトに格納して下さい。

expect: {Frontend: 3, Backend: 4}

engineers = [
    {"Type": 'Frontend'},
    {"Type": 'Backend'},
    {"Type": 'Backend'},
    {"Type": 'Frontend'},
    {"Type": 'Frontend'},
    {"Type": 'Backend'},
    {"Type": 'Backend'}
]
解答
result = {}
for engineer in engineers:
    result.setdefault("Frontend", 0)
    result.setdefault("Backend", 0)
    if engineer["Type"] == "Frontend":
        result["Frontend"] += 1
    elif engineer["Type"] == "Backend":
        result["Backend"] += 1

print(result)

問題⑮

次の変数objを連想配列[{'A':'a'},{'B':'b'}]にして下さい。

obj = {
    "a": "A",
    "b": "B",
}
解答
result = [{value: key} for key, value in obj.items()]
print(result)

問題⑯

次の変数arrをオブジェクト{"A":"0", "B":"1"}にして下さい。

arr = ["A", "B"]
解答
result = {val: index for val, index in enumerate(arr)}
print(result)

問題⑰

次の変数fruitsの中から"みかん"、"ぶどう"をキーに持つオブジェクトのみを抽出し、新しい変数selectedOrangeAndGrapeに格納して下さい。

fruits = {
    "みかん": {"Price": 200, "Num": 5},
    "いちご": {"Price": 400, "Num": 1},
    "ぶどう": {"Price": 380, "Num": 7},
}
解答
selectedOrangeAndGrape = {key: value for key,
                          value in fruits.items() if key == "みかん" or key == "ぶどう"}

print(selectedOrangeAndGrape) # {'みかん': {'Price': 200, 'Num': 5}, 'ぶどう': {'Price': 380, 'Num': 7}}

問題⑱

次の配列の中で一番大きい値を求めて下さい。

array = [40, 100, 300, 50]
解答
from functools import reduce

max = reduce(lambda a, b: a if a > b else b, array)

print(max) # 300

問題⑲

次の連想配列のオブジェクトのキー名を"0"→"id"、"1"→"shop"に変更して下さい。

expect: [
{ Id: 'id1', Shop: '店A' },
{ Id: 'id2', Shop: '店B' },
{ Id: 'id3', Shop: '店C' }
]

srcData = [
    {0: 'id1', 1: '店A'},
    {0: 'id2', 1: '店B'},
    {0: 'id3', 1: '店C'}
]
解答
for src in srcData:
    src["Id"] = src.pop(0)
    src["Shop"] = src.pop(1)

print(srcData)

問題⑳

次の連想配列の果物の詳細が書かれた各オブジェクトから'TotalAmount'(個数の合計),'Price'(合計金額)をプロパティにもつ連想配列を作成してください。

cart = [
    {
        "Item": 'いちご',
        "Price": 150,
        "Amount": 3
    },
    {
        "Item": 'みかん',
        "Price": 250,
        "Amount": 3
    },
    {
        "Item": 'ぶどう',
        "Price": 300,
        "Amount": 2
    }
]
解答
from functools import reduce

price = reduce((lambda x, y: x + y),
               [trip["Price"] for trip in cart])
amount = reduce((lambda x, y: x + y),
                [trip["Amount"] for trip in cart])

result = {"Price": price, "TotalAmount": amount}

print(result)

問題㉑

次の1~30までの数字が格納された配列'item'を10分割、14分割した二次元配列'newItems1','newItems2'を作成してください。

list = [index + 1 for index in range(30)]
解答
def division(n):
    result = [list[idx:idx + n] for idx in range(0, len(list), n)]
    return result


print(division(10))
print(division(14))

問題㉒

引数に奇数、偶数を順に受け取り、返り値として自然数を順に並べた配列を返す関数(getNaturalNumber)を作成してください。

解答
def getNaturalNumber(odd: list, even: list):
    result = odd + even
    return sorted(result)


print(getNaturalNumber([1, 3, 5], [2, 4, 6]))

Discussion