Объединение словарей списков в Python

Быстрый и грязный:

(В зависимости от того, насколько большой массив)

  • Цикл через каждую мозаику
  • чертит линию к Световому сигналу
  • , Если какое-либо парирование строки поражает X, то это находится в тени
  • (дополнительно): вычислите сумму X, строка проходит, и действительно представьте себе математику к determint пропорция мозаики в тени. NB: Это могло быть сделано путем сглаживания строки между мозаикой и Светом (поэтому рассмотрение других мозаик вдоль маршрута назад к источнику света) во время процедуры пороговой обработки, они появятся как маленький anomolies. В зависимости от логики использовал Вас, мог потенциально определить, насколько (если вообще) мозаика находится в тени.

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

Это могло быть куполом вполне прилично при помощи обработки изображения и проводящий прямые линии между эльфами (мозаики), Если строки полу прозрачный, и эти X блоков являются полупрозрачными снова. Вы можете порог изображение, чтобы определить, пересеклась ли строка 'X'

, Если у Вас есть опция использовать сторонний инструмент, затем идентификатор, вероятно, берет его. В конечном счете это могло бы оказаться более быстрым, но Вы поймете меньше о Вашей игре.

20
задан SilentGhost 30 September 2009 в 00:09
поделиться

5 ответов

If the list of tuples is sorted, itertools.groupby, as suggested by @gnibbler, is not a bad alternative to defaultdict, but it needs to be used differently than he suggested:

import itertools
import operator

def lot_to_dict(lot):
  key = operator.itemgetter(0)
  # if lot's not sorted, you also need...:
  # lot = sorted(lot, key=key)
  # NOT in-place lot.sort to avoid changing it!
  grob = itertools.groupby(lot, key)
  return dict((k, [v[1] for v in itr]) for k, itr in grob)

For "merging" dicts of lists into a new d.o.l...:

def merge_dols(dol1, dol2):
  keys = set(dol1).union(dol2)
  no = []
  return dict((k, dol1.get(k, no) + dol2.get(k, no)) for k in keys)

I'm giving [] a nickname no to avoid uselessly constructing a lot of empty lists, given that performance is important. If the sets of the dols' keys overlap only modestly, faster would be:

def merge_dols(dol1, dol2):
  result = dict(dol1, **dol2)
  result.update((k, dol1[k] + dol2[k])
                for k in set(dol1).intersection(dol2))
  return result

since this uses list-catenation only for overlapping keys -- so, if those are few, it will be faster.

15
ответ дан 30 November 2019 в 01:05
поделиться

collections.defaultdict работает следующим образом:

from collections import defaultdict
dic = defaultdict(list)
for i, j in tuples:
    dic[i].append(j)

аналогично для dicts:

a, b = {1:[2, 3], 2:[3]}, {1:[4], 3:[1]}
de = defaultdict(list, a)
for i, j in b.items():
    de[i].extend(j)
4
ответ дан 30 November 2019 в 01:05
поделиться

defaltdict спешит на помощь (как обычно)

from collections import defaultdict
my_dict = defaultdict(list)

for key,value in original_list:
    my_dict[key].append(value)

Объединение двух dicts может быть выполнено следующим образом (обратите внимание, что дубликаты будут сохранены):

for key,value in orig_dict:
    new_dict[key].extend(value)
3
ответ дан 30 November 2019 в 01:05
поделиться

Вот стиль выполнения итератора

>>> mylist=[(1, 2), (1, 3), (2, 3)]
>>> from itertools import groupby
>>> from operator import itemgetter
>>> mylist=[(1, 2), (1, 3), (2, 3)]
>>> groupby(mylist,itemgetter(0))

>>> list(_)
[(1, <itertools._grouper object at 0xb7d402ec>), (2, <itertools._grouper object at 0xb7c716ec>)]
0
ответ дан 30 November 2019 в 01:05
поделиться

I wanted these done in one line just for fun:

>>> from itertools import groupby
>>> t=(1, 2), (1, 3), (2, 3) 
>>> [(i,[x for _,x in list(f)]) for i,f in groupby(sorted(t),lambda t: t[0])] 
[(1, [2, 3]), (2, [3])]
>>> b={1:[2, 3], 2:[3]}, {1:[4], 3:[1]}
>>> dict([(key,sum([i[1::][0] for i in elements],[])) for key,elements in groupby(sorted(b[0].items()+b[1].items()),lambda t: t[0])])
{1: [2, 3, 4], 2: [3], 3: [1]}
0
ответ дан 30 November 2019 в 01:05
поделиться
Другие вопросы по тегам:

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