2013-05-15 2 views
3

У меня есть это:приращением defaultdict внутри списка понимания (Python)

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

Теперь это работает. Но мне интересно, можно ли это сделать (увеличение количества отдельных строк в defaultdict) с помощью использования списка?

Это ошибка синтаксиса:

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

Кстати, почему не может использовать одно выражение, как это в пределах списка понимания? Это прямолинейно и значительно улучшило бы и краткость и производительность такого кода.

+1

Почему, по вашему мнению, это улучшит производительность? Вам все равно нужно перебирать self.lines, и теперь вы ввели накладные расходы на создание списка, в котором у вас не было никого. И это не более красноречиво: вы продали двоеточие и новую линию для пары квадратных скобок. – chepner

+0

@chepner, я добавил аналогичную заметку к моему ответу в то же время, когда вы написали свой;) – shx2

ответ

3

Ваш список понимание не работает, потому что задания не являются выражениями.

Вы не должны использовать понимание списка для замены цикла. Напишите цикл. Для построения списков используются списки.

Почему, по вашему мнению, понимание списка улучшит производительность? Во всяком случае, это потенциально может повредить производительность, потому что ему необходимо выделить и назначить временный список, который он создает, который никогда не используется. Представьте, что у вас есть 1 000 000 000 строк в вашем первоначальном списке.

3

Вы можете использовать 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 назначение не поддерживает задания, и даже с помощью LCs для побочного эффекта также плохая практика.

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

Read: Is it Pythonic to use list comprehensions for just side effects?

Смежные вопросы