6

私はこれを持っています:

   self.lines = [...]
   cnt = defaultdict(int)
   for line in self.lines:
       cnt[line] += 1

これで動作します。しかし、リスト内包表記を使用してそれ(defaultdictの特定の行のカウントを増やす)ができるのではないでしょうか?

これは構文エラーです:

   [cnt[line] += 1 for line in self.lines]

ちなみに、リスト内包表記でこのような式を使用できないのはなぜですか? それは簡単で、そのようなコードの簡潔さとパフォーマンスの両方を大幅に改善します。

4

2 に答える 2

5

割り当ては式ではないため、リスト内包表記は機能しません。

ループを置き換えるためにリスト内包表記を使用しないでください。ループを書きます。リスト内包表記は、リストの構築に使用されます。

リスト内包表記がパフォーマンスを向上させるのはなぜだと思いますか? どちらかといえば、作成した一時リストに割り当てて割り当てる必要があり、その後は使用されないため、パフォーマンスが低下する可能性があります。元のリストに 1,000,000,000 行あるとします。

于 2013-05-15T14:28:55.107 に答える
4

ここで使用できcollections.Counterます:

>>> from collections import Counter
>>> lis = [1,2,3,3,3,5,6,1,2,2]
>>> Counter(lis)
Counter({2: 3, 3: 3, 1: 2, 5: 1, 6: 1})

cnt[line] += 1割り当て LC は割り当てをサポートしていません。LC を副作用のために使用することも悪い習慣です。

lis = []
[lis.append(x) for x in xrange(5)]  #bad

読む:副作用だけにリスト内包表記を使うのは Pythonic ですか?

于 2013-05-15T14:26:33.927 に答える