有效比较python列表中的值

时间:2011-02-05 21:25:46

标签: python algorithm logic

我有一个由元组组成的列表,例如下面的元素:

(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循环(每个级别一个)?

2 个答案:

答案 0 :(得分:2)

两个注释:

  1. 您不会在Python中编写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
  2. 考虑使用named tuple作为值的描述性名称。还考虑重组数据。例如,您可以使用{ level_1: { id_1: (val_1, val_2), id_2: ...}, level_2: ...}
  3. 等格式

    至于实际问题:即使使用当前格式也可以概括它(注意代码假设级别是整数 - 我知道它们不是,但我不知道你是如何从一个级别到达你系统中的下一个。)。

    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开始的一个级别是什么? 3B4A4B,......?要解决此问题,您可能希望将级别重新定义为整数,并存储从字符串名称到整数值的映射。整数是用于存储级别的良好数据类型。