今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、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 iterablesstrict = 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 iterablesstrict = 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は、他の人のソースが見れるのでとても参考になる。

よく仕様を理解しているなと感心する。