我有一个由元组组成的列表,例如下面的元素:
(2809.3994479562093, 1032.5989696312365, 0.0), {'level': '2', 'id': '1'})
为字典中的级别键设置不同的值(增加但不总是整数,即1,2,3,3B,4A,5,5A,6,7),id逐渐增加并且仅包含整数。
我想要找出的是元组的第一个元素中前两个值的值,即浮点2809.399 ...和1032.5989 ...在级别为+/- 1的情况下与我目前所处的不同。 换句话说,2级id 1应该在1级和3级上寻找id 1.
我想到的是以下内容:
for x in xrange(len(net.lifts)):
if net.lifts[x][1]["level"] == "2":
for y in xrange(len(net.lifts)):
if (net.lifts[y][1]["level"] == "1" or net.lifts[y][1]["level"] == "3") and net.lifts[y][1]["id"] == net.lifts[x][1]["id"]:
print "edge:" + str(net.lifts[x][0][:2]) + str(net.lifts[y][0][:2])
它有效。但是,它要求我为每个案例定义long if语句。 有没有更有效的方法(算法)抽象这个而不必创建7个if循环(每个级别一个)?
答案 0 :(得分:2)
两个注释:
for i in range(len(xs)): # use xs[i]
,而不是在C中编写int i = 0; while (i < N) { /* use xs[i]; */ i++; }
。您可以编写for x in xs: # use x
。{ level_1: { id_1: (val_1, val_2), id_2: ...}, level_2: ...}
。至于实际问题:即使使用当前格式也可以概括它(注意代码假设级别是整数 - 我知道它们不是,但我不知道你是如何从一个级别到达你系统中的下一个。)。
for lift in net.lifts:
for other_lift in net.lifts:
if (lift[1]['id'] == other_lift[1]['id'] and
abs(lift[1]['level'] - other_lift[1]['level']) <= 1):
# got one
将更容易(更快,更复杂 - 目前O(n**2)
)更加深思熟虑的数据结构。
答案 1 :(得分:1)
您应重组数据。它当前所处的格式不利于您尝试解决的问题,因为它是按顺序形式进行的,并且您正在尝试像在字典中那样进行随机访问。
将其重新排列成字典:
'level':
'id':
(data)
还有一个问题是,如果你的等级不是整数,你需要定义“当前等级为+/- 1”意味着什么。也就是说,从3
开始的一个级别是什么? 3B
,4A
,4B
,......?要解决此问题,您可能希望将级别重新定义为整数,并存储从字符串名称到整数值的映射。整数是用于存储级别的良好数据类型。