почему я не могу использовать метод get () в понимании dict [duplicate]

Дело в том, что я вручную добавил подмодуль :k3b-geohelper в файл settings.gradle

 include ':app', ':k3b-geohelper'

, и все работает отлично в моей системе сборки mswindows

Когда я нажал обновление для github fdroid build system не удалось выполнить

  Cannot evaluate module k3b-geohelper : Configuration with name 'default' not found

. Окончательным решением было то, что папка подмодуля была названа k3b-geoHelper not k3b-geohelper.

В случае MSWindows не имеет значения, но в системе Linux это делает

0
задан Martijn Pieters 10 November 2015 в 05:47
поделиться

4 ответа

Нет, нет. Понятие dict создает новый элемент new для каждой итерации, а вашему коду нужно создать меньше элементов (консолидировать значения).

Невозможно ключи доступа, созданные на более ранней итерации, не без использования (уродливых, непитонических) побочных эффектов. Объект dict, который будет создан посредством понимания, пока не существует, поэтому нет возможности создать самонаклад.

Просто придерживайтесь своего for цикла, это

Альтернативой было бы использовать сортировку и группировку, алгоритм O (NlogN) и простой O (N) вашего прямого цикла:

from itertools import groupby
from operator import itemgetter

res = {key: sum(t[1] for t in group) 
       for key, group in groupby(sorted(data, key=itemgetter(0)), key=itemgetter(0))}
4
ответ дан Martijn Pieters 21 August 2018 в 17:29
поделиться

Используйте reduce и collections.Counter :

>>> from operator import add
>>> from collections import Counter
>>> reduce(add, (Counter(dict([x])) for x in data))
Counter({'c': 9, 'a': 5, 'b': 4, 'd': 3})
1
ответ дан Ashwini Chaudhary 21 August 2018 в 17:29
поделиться

Не используйте oneliner. Вместо этого используйте collections.defaultdict и простой цикл:

>>> pairs = [('a', 1), ('b', 3), ('a', 4), ('c', 9), ('b', 1), ('d', 3)]
>>> result = defaultdict(int)
>>> for key, value in pairs:
...     result[key] += value
...
>>> result
defaultdict(<class 'int'>, {'a': 5, 'c': 9, 'b': 4, 'd': 3})

Легко понять, питонов и быстро.

2
ответ дан pillmuncher 21 August 2018 в 17:29
поделиться

Это похоже на то, что вы пытаетесь сделать. Но я не буду рекомендовать это, поскольку читаемость страдает.

data = [('a',1),('b',3),('a',4),('c',9),('b',1),('d',3)]
print reduce(lambda d,i: [d.__setitem__(i[0],d.get(i[0],0)+i[1]),d][1], data, {})

Выход

{'a': 5, 'c': 9, 'b': 4, 'd': 3}
1
ответ дан thefourtheye 21 August 2018 в 17:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: