2015-07-26 2 views
3

py 2.7. У меня есть словарь списков. Каждый цикл каждого списка перезаписывается новой обновленной версией.Добавление/переписывание словаря в зависимости от элементов

Я использую систему частиц третьей стороны. То, что я делаю, состоит в том, что каждый ключ является номером индекса частицы, а список - его позицией и предыдущими позициями.

Но когда частица «умирает», индексы частиц все смещаются. Ключ будет перезаписан неправильно, когда рождается новая частица с тем же индексом, что и мертвая частица. Я хочу сохранить этот ключ с позициями мертвой частицы.

Вот код, как сейчас:

if frame == 0: 
    branches = {} 

... 

for p in xrange(particle_count): 
    xp = emitter.GetParticle(p) #xp = current particle 
    trail = [] 
    index = xp.GetIndex() 
    trail_length = xp.GetCustomDataCount() #number of previous positions 

    for i in xrange(trail_length): 
     previous_position = xp.GetCustomData(i) 
     trail.append(previous_position) 
     branches [index] = trail 

Я думал сравнивая первый элемент каждого списка с первым элементом списка, который он пытается перезаписать. Тогда, если это не так, добавьте 1 к номеру индекса, пока не появится свободное место ...?

EDIT - Я добился дальнейшего прогресса и определил, что мне нужно сделать, но не знаю питона. Вот некоторые новый код:

for p in xrange(particle_count): 
    xp = emitter.GetParticle(p) #xp = current particle 
    trail = [] 
    index = xp.GetIndex() 
    trail_length = xp.GetCustomDataCount() 

    for i in xrange(trail_length): 
     previous_position = xp.GetCustomData(i) 
     trail.append(previous_position) 

    if index in branches: 
     this_trail = trail[0] 
      set_trail = branches[index] 
      set_trail = set_trail[0] 

      if this_trail == set_trail: 
       branches[index] = trail 
      else: 
       for b in branches: 
        set_trail = branches[b] 
        set_trail = set_trail[0] 
        if this_trail == set_trail: 
         branches[index] = trail 
         break 
    else: 
     branches[index] = trail 

Проблема: Когда я говорю «если индекс в отраслях ..» Я проверяю каждую запись матча. Если тропы одинаковы, старый перезаписывается новым. Однако, если индекс существует в словаре, но не совпадает с записью, ничего не произойдет. Вот что мне нужно:

if index in branches: 
    this_trail = trail[0] 
    set_trail = branches[index] 
    set_trail = set_trail[0] 

    if this_trail == set_trail: 
     branches[index] = trail 
    else: 
     check all entries for a match(like i currently do) 
     if match, overwrite entry 
     if no match, add entry to a non-existing key 
else: 
    branches[index] = trail 
+0

Если вы основываете некоторые вычисления на основе этого, не сохраняете в другом индексе (другую позицию), вызывают проблемы позже? Не можете ли вы просто скопировать словарь (и сохранить где-нибудь еще), когда увидите, что частица мертва, и начать с нового словаря? –

+0

Привет Ананд. Это имело бы смысл. Но этот момент в коде - это в значительной степени конец скрипта. Все, что я делаю после этого, идет по пути частицы и рисует линию на экране, например, соединяет точки. Я не называю это иначе, так что это не имеет значения. – tanzola

+0

Так вы сталкиваетесь с любыми проблемами с помощью метода, который вы указали в конце? В чем проблема? –

ответ

1

Хорошо, я думаю, что я получаю свой вопрос, ваш код при условии, что словари упорядочены, но они не являются, они имеют произвольный порядок, и фактический порядок действительно зависит от введения и историю удаления вашего словаря, а также конкретную реализацию python.

Вы не должны зависеть от заказанного вами словаря, если вы хотите заказать в своем словаре, вы можете попробовать использовать collections.OrderedDict.

Они похожи на обычные словари, за исключением того, что они сохраняют порядок элементов в них. Пример -

>>> from collections import OrderedDict 
>>> d = OrderedDict() 
>>> d[1] = 2 
>>> d[5] = 10 
>>> d[2] = 11 
>>> 
>>> d 
OrderedDict([(1, 2), (5, 10), (2, 11)]) 

Хотя вы можете пересмотреть ли словарь фактической структуры данных, которые вы хотите использовать. Если ваши индексы являются равными числами, вам лучше использовать простой список. Если они являются кортежами координат (x,y), для этого вы можете использовать 2-мерный список.

+0

Это полезно. Я обновил сообщение снова. – tanzola

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