0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

要素数の異なる配列を長い方の要素数だけzipでループする実装

Last updated at Posted at 2022-05-29

カードゲームを実装する際、異なる配列を同時にループさせて要素を比較するということがあるかと思います。
そういった場合、pythonでは異なる要素を同時にループさせるzipを用いて実装することを最初のうちは考えるかと思います。
しかし、以下のようにzipは短い方の配列に合わせて、長い方をスライスしてしまいますので要素数が多い方が勝ちみたいなケースには対応できません。

a_array = [4, 3, 2]
b_array = [4, 3, 2, 1]

for a, b in zip(a_array, b_array):
    print(f'{a}:{b}')

==== 出力 ====
4:4
3:3
2:2

そういった場合は以下のように短い方の配列に仮の値を埋めるような実装を行うかと思います。

a_array = [4, 3, 2]
b_array = [4, 3, 2, 1]
lenDiff = len(a_array) - len(b_array)
if lenDiff > 0:
    b_array += [-1] * lenDiff
if lenDiff < 0:
    a_array += [-1] * -lenDiff

for a, b in zip(a_array, b_array):
    print(f'{a}:{b}')

==== 出力 ====
4:4
3:3
2:2
-1:1

pythonではitertoolsというパッケージにzip_longestという関数においてfillvalueという引数に任意の値を指定すればその値で埋めてくれるようになっているので、こちらを使うといいと思います。

from itertools import zip_longest

a_array = [4, 3, 2]
b_array = [4, 3, 2, 1]

lenDiff = len(a_array) - len(b_array)

for a, b in zip_longest(a_array, b_array, fillvalue=-1):
    print(f'{a}:{b}')

==== 出力 ====
4:4
3:3
2:2
-1:1

参考:python.org itertools

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?