我有一个字符串列表
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方式,然后这个蛮力的方式。 :-)你会如何解决这个问题?
答案 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)))