LoginSignup
2
1

More than 3 years have passed since last update.

Python 3 varsの応用

Last updated at Posted at 2020-06-04

Python 3.xの組み込み関数varsの応用的なコード集です。

この投稿の方針

dict1 = {"a": "a", "b": "b", "c": "c"}
# タプルのまま受け取ってインデクサ
{item[0]: item[1] for item in dict1}
# アンパック代入
{key: value for key, value in dict1}

辞書内包記法でコピーする

varsの戻り値は辞書なのでitems()と辞書内包記法でコピーできます。items()の要素はキーと値のタプルです。

import sys
from pprint import pp

dict1 = {key: value for key, value in vars(sys).items()}
pp(dict1)
出力
{'__name__': 'sys',
 '__doc__': 'This module provides access to some objects ...,
 ...

注意:vars組み込み関数の戻り値は辞書型(<class 'dict'>)です。要素(キーと値のタプル)を列挙するにはvars(sys).items()とする必要があります。for item in vars(sys)とした場合はvars(sys).keys()として扱われ、キーの1文字目をキー、2文字目を値とした辞書が作成されます。アンパックを使用する場合はエラーが発生するので気づきます。

キーと値の型の辞書を作成する

import sys
from pprint import pp

dict1 = {key: type(value) for key, value in vars(sys).items()}
pp(dict1)
出力
{'__name__': <class 'str'>,
 '__doc__': <class 'str'>,
 '__package__': <class 'str'>,
 '__loader__': <class 'type'>,
 ...

値の型を列挙する

import sys
from pprint import pp

set1 = {type(value).__name__ for value in vars(sys).values()}
pp(set1)
出力
{'ModuleSpec',
 'NoneType',
 'SimpleNamespace',
 'TextIOWrapper',
 'bool',
 'builtin_function_or_method',
 'dict',
 'flags',
 'float_info',
 'function',
 'hash_info',
 'int',
 'int_info',
 'list',
 'str',
 'thread_info',
 'tuple',
 'type',
 'version_info'}
  • 型の名前はtype(...).__name__で取得できます。
  • {e for e in v}は集合内包記法です。

値の型の出現回数を数える


import sys
from collections import Counter
from pprint import pp

counter = Counter((type(value).__name__ for value in vars(sys).values()))
pp(counter)
出力
Counter({'builtin_function_or_method': 42,
         'str': 16,
         'TextIOWrapper': 6,
         'int': 5,
         'list': 5,
         'dict': 3,
         'tuple': 2,
         'NoneType': 2,
         'type': 1,
         'ModuleSpec': 1,
         'float_info': 1,
         'int_info': 1,
         'hash_info': 1,
         'version_info': 1,
         'SimpleNamespace': 1,
         'flags': 1,
         'thread_info': 1,
         'bool': 1,
         'function': 1})

組み込み関数・メソッドのみ取得する

import sys
import types
from pprint import pp

dict1 = {key: value for item in vars(sys).items()
         if isinstance(value, types.BuiltinFunctionType)}
pp(dict1)
出力
{'addaudithook': <built-in function addaudithook>,
 'audit': <built-in function audit>,
 'breakpointhook': <built-in function breakpointhook>,      
 'callstats': <built-in function callstats>,
 '_clear_type_cache': <built-in function _clear_type_cache>,
 ...

組み込み関数・メソッド以外を取得する

import sys
import types
from pprint import pp

dict1 = {key: value for item in vars(sys).items()
         if not isinstance(value, types.BuiltinFunctionType)}
pp(dict1)
出力
{'__name__': 'sys',
 '__doc__': 'This module provides ...',
 '__package__': '',
 '__loader__': <class '_frozen_importlib.BuiltinImporter'>,
 '__spec__': ModuleSpec(name='sys', loader=<class '_frozen_importlib.BuiltinImporter'>),
 ...

値を適当な長さに切り詰める

import sys
import types
from pprint import pp
from typing import Optional


def str_truncate_singleline(s, width: int, linesep: Optional[str]):
    s = str(s)
    if not isinstance(width, int):
        raise TypeError()
    addsEllipsis: bool = False
    if linesep is not None:
        i: int = s.find(linesep)
        if i != -1:
            s = s[0:i]
            addsEllipsis = True
    if len(s) + len("...") > width:
        return s[0:width-len("...")] + "..."
    return s + "..." if addsEllipsis else s


dict1 = {key: str_truncate_singleline(value, 50, "\n")
         for item in vars(sys).items()
         if not isinstance(value, types.BuiltinFunctionType)}
pp(dict1)
2
1
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
2
1