5

これはばかげていると確信していますが、私はそれを回避することはできません。次のような、各キーの値の数が異なる辞書があります。

'John greased ': ['axle', 'wheel', 'wheels', 'wheel', 'engine', ''], 
'Paul alleged ': ['truth', 'crime', 'facts', 'infidelity', 'incident', ''], 
'Tracy freed ': ['animals', 'fish', 'slaves', 'slaves', 'slaves', 'pizza'], 
'Lisa plowed ': ['field', 'field', '', '', '', ''],

一意の値ごとではなく、各キーにいくつの値があるかを知りたいのですが、繰り返されるかどうかにかかわらず、キーごとにいくつのトークンがあるかを知りたいです。したがって、次のような結果が得られます。

John greased  5
Paul alleged  5
Tracy freed  6
Lisa plowed  2

私はこれを使用して、以下のコードを使用して解決しようとしていました:

for key, value in sorted(result.items()):
         print(key, len(value)) 

しかし、値が欠落しているため、すべての長さが同じであることがわかります。これを解決する方法、またはどこで見つけるかについてのアイデアはありますか? 助けてくれてありがとう。

4

4 に答える 4

18

これを解決する 1 つの方法は、最後の行を変更することです。

print(key, len([item for item in value if item])) 

したがって、完全なコード:

ITEMS = {
    'John greased ': ['axle', 'wheel', 'wheels', 'wheel', 'engine', ''],
    'Paul alleged ': ['truth', 'crime', 'facts', 'infidelity', 'incident', ''],
    'Tracy freed ': ['animals', 'fish', 'slaves', 'slaves', 'slaves', 'pizza'],
    'Lisa plowed ': ['field', 'field', '', '', '', ''],
}

for key, value in ITEMS.items():
    #print value
    print(key, len([item for item in value if item]))

以下でも使用できfilterますbool

print(key, len(filter(bool, value)))

したがって、ループ:

for key, value in ITEMS.items():
    #print value
    print(key, len(filter(bool, value)))

Python 3の場合と同様に適用listする必要があります。filterprint(key, len(list(filter(bool, value))))

于 2013-11-07T18:12:13.103 に答える
3

とともに使用するfilterNone、渡された iterable からすべての偽の値を除外します。

Python3 ではfilterイテレータを返すので、それを呼び出す必要がありますlist()

>>> lis = ['field', 'field', '', '', '', '']
>>> list(filter(None, lis))
['field', 'field']
>>> len(list(filter(None, lis)))
2

コード:

>>> my_dict = {
    'John greased ': ['axle', 'wheel', 'wheels', 'wheel', 'engine', ''],
    'Paul alleged ': ['truth', 'crime', 'facts', 'infidelity', 'incident', ''],
    'Tracy freed ': ['animals', 'fish', 'slaves', 'slaves', 'slaves', 'pizza'],
    'Lisa plowed ': ['field', 'field', '', '', '', ''],
}
for k,v in my_dict.items():
    print (k, len(list(filter(None, v))))
...     
Paul alleged  5
Lisa plowed  2
John greased  5
Tracy freed  6

filter(None,..)とリスト内包表記のタイミング比較:

>>> lis = ['field', 'field', '', '', '', '']*100
>>> %timeit list(filter(None, lis))
10000 loops, best of 3: 22.2 us per loop
>>> %timeit [item for item in lis if item]
10000 loops, best of 3: 53.1 us per loop
>>> lis = ['field', 'field', '', '', '', '']*10000
>>> %timeit list(filter(None, lis))
100 loops, best of 3: 2.36 ms per loop
>>> %timeit [item for item in lis if item]
100 loops, best of 3: 5.22 ms per loop
于 2013-11-07T18:12:18.500 に答える