📘
配列処理の問題集(Python)
はじめに
過去にJavaScript
とDart
で配列処理の問題集を作成しました。(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