pythonでlistをdictに変換

3548 ワード

最近、プロジェクトではlistをdict形式に変換することがよくあります.以前はforループのみでlistの各値を取り出し、updateをdictに取り出します.
例1
scrabble_scores = [(1, "E A O I N R T L S U"), (2, "D G"), (3, "B C M P"), (4, "F H V W Y"), (5, "K"), (8, "J X"), (10, "Q Z")]

上のlistをkeyをアルファベット、valueを点数に分割するにはどうすればいいですか?
LETTER_SCORES = {letter: score for score, letters in scrabble_scores for letter in letters.split()}

上式の処理により、{"A":1.......}このような形式.まずsplit()関数でアルファベットを分離し、lettersのletterを辞書のkey値として取り出し、スコアをvalueとします.
例2
Letter = namedtuple('Letter', 'name amount value')
distribution = [Letter(name='A', amount='9', value='1'), Letter(name='B', amount='2', value='3'), Letter(name='C', amount='2', value='3'), Letter(name='D', amount='4', value='2'), Letter(name='E', amount='12', value='1'), Letter(name='F', amount='2', value='4'), Letter(name='G', amount='3', value='2'), Letter(name='H', amount='2', value='4'), Letter(name='I', amount='9', value='1'), Letter(name='J', amount='1', value='8'), Letter(name='K', amount='1', value='5'), Letter(name='L', amount='4', value='1'), Letter(name='M', amount='2', value='3'), Letter(name='N', amount='6', value='1'), Letter(name='O', amount='8', value='1'), Letter(name='P', amount='2', value='3'), Letter(name='Q', amount='1', value='10'), Letter(name='R', amount='6', value='1'), Letter(name='S', amount='4', value='1'), Letter(name='T', amount='6', value='1'), Letter(name='U', amount='4', value='1'), Letter(name='V', amount='2', value='4'), Letter(name='W', amount='2', value='4'), Letter(name='X', amount='1', value='8'), Letter(name='Y', amount='2', value='4'), Letter(name='Z', amount='1', value='10')]

上のdistributionのnameとvalueをdict形式に変換するにはどうすればいいですか?
  • は、まずnameとvalueの値を2つのlistにそれぞれ配置することができ、
  • を次のコードで実現することができる.
    names = [letter.name for letter in distribution]
    values = [int(letter.value) for letter in distribution]
  • その後zip()関数によってnameとvalueを1つずつ対応させることができる:
  • zip(names, values)
    
    
    for i in zip(names, values):
        print(i)

    ループ印刷により,nameとvalueが1つずつ対応していることが分かった.
  • は最後に得られたメタグループからなるlistを直接dictに変換し,ここではdict()関数を直接用いるだけでよい.したがって、上記の機能要件を実現するには、次のコード:
  • のみが必要である.
    LETTER_SCORES = dict(zip(
            [letter.name for letter in distribution],
            [int(letter.value) for letter in distribution]
        ))

    結果は次のとおりです.
    {'A': 1, 'B': 3, 'C': 3, 'D': 2, 'E': 1, 'F': 4, 'G': 2, 'H': 4, 'I': 1, 'J': 8, 'K': 5, 'L': 1, 'M': 3, 'N': 1, 'O': 1, 'P': 3, 'Q': 10, 'R': 1, 'S': 1, 'T': 1, 'U': 1, 'V': 4, 'W': 4, 'X': 8, 'Y': 4, 'Z': 10}