今日は、PythonのZip関数で感銘を受けたの日。
目次
とある日
LeetCodeで問題を解いていて見つけたPython Zipの頭の良い使い方を見つけたのでメモ。
https://leetcode.com/problems/longest-common-prefix/discuss/1563979/Simplest-oror.-python-oror-zip
Input: strs = ["flower","flow","flight"] Output: "fl"
class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: i=0 for s in zip(*strs): if len(set(s))!=1: break i+=1 return strs[0][0:i]
Zip関数
zip
( iterables、strict = False*)複数の反復可能オブジェクトを並行して反復し、それぞれのアイテムを含むタプルを生成します。
例:
>>>
>>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']): ... print(item) ... (1, 'sugar') (2, 'spice') (3, 'everything nice')
より正式には:
zip()
タプルのイテレータを返します。ここで、i番目のタプルには、各引数iterableからのi番目の要素が含まれます。
例:Dict変換
2つの配列を結合して辞書配列に変換するときによく使用します。
import pprint import string a = list(range(26)) b = list(string.ascii_lowercase) pprint.pprint(dict(zip(a,b))) {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z'}
すげーポイント
その1
Zip関数の引数の扱いとListとStringの理解力がすごい。
zip
( iterables、strict = False*)複数の反復可能オブジェクトを並行して反復し、それぞれのアイテムを含むタプルを生成します。
Zip関数の引数がListだけではなく、反復可能オブジェクトつまりString型にも適用可能ということ。
PythonだとString型もListのように扱うことができます。
a = list(range(26)) print(type(a),a[3]) b = "".join(list(map(str,a))) print(type(b),b[3]) # <class 'list'> 3 # <class 'str'> 3
これはPythonの挙動をよくわかっている使い方。
ちゃんとListを*
で展開することでList型ではなくString型として認識させている。
その2
Zip関数の返り値に理解力がすげー。
この挙動はZip関数の入力がlistに変換されることがわかっていれば理解しやすいが、引数と返り値の使い方がすごいと思った。
def longestCommonPrefix(strs) -> str: i=0 for s in zip(*strs): print(s) if len(set(s))!=1: break i+=1 return strs[0][0:i] longestCommonPrefix(["flower","flow","flight"])
Zip関数の返り値。
('f', 'f', 'f') ('l', 'l', 'l') ('o', 'o', 'i')
if len(set(s))!=1
このlen関数とset関数はかなり使うやり方。
重複を検知するときに便利。
これいつ使うの?
この問題を解くときぐらい?
自分はただただPythonの理解力がすごいなと感心しただけ。
〆
LeetCodeは、他の人のソースが見れるのでとても参考になる。
よく仕様を理解しているなと感心する。