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,直到有空位......?
编辑 - 我已经取得了进一步的进展,并确定了我需要做什么,但不知道python。这是一些新代码: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 branch in branches ..”我正在检查每个条目的匹配。如果路径相同,则旧路径将被新路径覆盖。但是,如果索引确实存在于字典中,但与条目不同,则不会发生任何事情。这就是我需要的:
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 :(得分: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维列表。