【问题标题】:Given two lists in python one with strings and one with objects, how do you map them?给定 python 中的两个列表,一个是字符串,一个是对象,你如何映射它们?
【发布时间】:2011-06-05 16:21:22
【问题描述】:

我有一个字符串列表

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

我想按照string_list的顺序对object_list中的对象进行排序

我可以做类似的事情

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

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

【问题讨论】:

    标签: python list sorting


    【解决方案1】:

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

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

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

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

    【讨论】:

    • +1 但不要忘记包含string_list 包含一个字符串的逻辑,该字符串的key 不在您的字典中。
    • @wheaties:不确定是否需要。如果是这样,只需将d[key] 替换为d.get(key) 即可在密钥不匹配时插入None
    【解决方案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,这是禁止的。

    【讨论】:

      【解决方案3】:

      您可以使用 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)))
      

      【讨论】:

        猜你喜欢
        • 2022-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2020-10-12
        • 2022-01-18
        • 2017-12-16
        相关资源
        最近更新 更多