给定python中的两个列表,一个包含字符串,另一个包含对象,如何映射它们?

时间:2011-06-05 16:21:23

标签: python list sorting

我有一个字符串列表

string_list = ["key_val_1", "key_val_2", "key_val_3", "key_val_4", ...]

和包含对象的列表

object_list = [object_1, object_2, object_3,...]

每个对象object_i都有一个属性key

我希望object_list 的顺序对string_list中的对象进行排序。

我可以做类似

的事情
new_list = []
for key in string_list:    
    for object in object_list:
        if object.key == key:
            new_list.append(object)

但必须有更多的pythonic方式,然后这个蛮力的方式。 :-)你会如何解决这个问题?

3 个答案:

答案 0 :(得分:8)

首先,创建一个将对象键映射到对象的字典:

d = dict((x.key, x) for x in object_list)

接下来使用列表推导创建排序列表:

new_list = [d[key] for key in string_list]

答案 1 :(得分:2)

将每个键映射到其所需的优先级:

key_precedence = dict((x, n) for n, x in enumerate(string_list))

然后按优先顺序排序:

object_list.sort(key=lambda x: key_precedence[x.key])

处理可能不在string_list中的键:

default = -1          # put "unknown" in front
default = sys.maxint  # put "unknown" in back
object_list.sort(key=lambda x: key_precedence.get(x.key, default))

如果string_list很短(例如10个或更少的项目),您可以简化:

object_list.sort(key=lambda x: string_list.index(x.key))
# But it's more cumbersome to handle defaults this way.

但是,对于较大长度的string_list,这是禁止的。

答案 2 :(得分:0)

您可以使用sort()方法的cmp参数:

object_list.sort(cmp=lambda x,y: cmp(string_list.index(x.key),
                                     string_list.index(y.key)))

或使用sorted()来避免就地替换:

sorted(object_list, cmp=lambda x,y: cmp(string_list.index(x.key),
                                        string_list.index(y.key)))