2

タプルのリストがあります:

l=[('soccer',11),('tennis',2),('chess',2),('xanadu',None)]

以下のように関数を定義するとします。

def func(x):
    if type(x) is int:
       return x*2
    else:
       return None

この関数をすべてのタプルの要素 [1] に適用する必要があり、結果は要素 [0] をキーとする辞書として返されます。

これはリスト 'l' の理解として可能ですか?
ちょっと面白くするために、func(x) が int を返す結果のみを含める必要があります。

期待される出力:

{'soccer':22,'tennis':4,'chess':4}
4

2 に答える 2

7

はい、タプル展開を使えばかなり簡単です

dict([(x, func(y)) for x, y in l])

またはすべてを一度に行う (2.7+)

{x: func(y) for x, y in l if isinstance(func(y), int)}

func が高価で、2回計算したくない場合は可能です(ただし、例のように単純なものであれば気にしません)

{key: value for key, value in ((x, func(y)) for x, y in l) if isinstance(value, int)}

またはpython 2.6.xの場合

dict((key, value) for key, value in ((x, func(y)) for x, y in l) if isinstance(value, int))

Nisan.Hがコメントしていたように、これは少し不明確になっているので、わかりやすくするために2行に分けてください

func_l = ((x, func(y)) for x, y in l)
result = dict((key, value) for key, value in func_l if isinstance(value, int))
于 2013-05-30T17:01:03.117 に答える
2
>>> l=[('soccer',11),('tennis',2),('chess',2)]
>>> def func(x):
        return x*2
... 
>>> dict((a, func(b)) for a,b in l)
{'tennis': 4, 'soccer': 22, 'chess': 4}

辞書内包表記を使用する:

>>> { a : func(b) for a,b in l}
{'tennis': 4, 'soccer': 22, 'chess': 4}

アップデート:

def func(x):
    return x*2

lis = [('soccer',11),('tennis',2),('chess',2),('xanadu',None)]

#do type checking here
print { a : func(b) for a,b in lis if isinstance(b, (int,float))}

#for py2.6 or earlier
print dict( (a, func(b)) for a,b in lis if isinstance(b, (int,float)))

出力:

{'tennis': 4, 'soccer': 22, 'chess': 4}
于 2013-05-30T17:02:34.903 に答える