【问题标题】:Pythonic way using list comprehension使用列表理解的 Pythonic 方式
【发布时间】:2014-12-15 14:13:02
【问题描述】:

我有这段代码,我知道它可以更高效....

return_list = []
for attribute in attributes:
    if attribute['internalname'] in attributenames:
        attr = Attribute();
        attr.name = attribute['internalname']
        attr.value = attribute['value']
        return_list.append(attr);

return return_list

我本可以轻松完成列表理解,但由于创建了对象 attr=Attributes(),我不知道该如何处理?

【问题讨论】:

  • 效率不会更高,只会更简洁。
  • @f.rodrigues 不太冗长通常也不太可读;生成器通常比长列表理解更好,特别是如果您不需要真正的列表。
  • 确实如此。这个 for 循环非常清楚,而答案使它的可读性更差。

标签: python list-comprehension


【解决方案1】:

使Attribute() 将名称和值作为参数:

return [Attribute(attr['internalname'], attr['value'])
        for attr in attributes if attr['internalname'] in attributenames]

如果你需要支持各种属性,你可以让它接受关键字参数:

return [Attribute(name=attr['internalname'], value=attr['value'])
        for attr in attributes if attr['internalname'] in attributenames]

如果两者都不是一个选项,则创建一个函数来创建具有namevalue 属性的Attribute 对象:

def create_attribute(name, value):
    attr = Attribute()
    attr.name = name
    attr.value = value
    return attr

return [create_attribute(attr['internalname'], attr['value'])
        for attr in attributes if attr['internalname'] in attributenames]

【讨论】:

    【解决方案2】:

    Attribute 是否有采用命名参数的 __init__ 方法?如果是这样,你可以做类似的事情

    return_list = [Attribute(name=attribute['internalname'], value=attribute['value']) for attribute in attributes if attribute['internalname'] in attributenames]
    

    【讨论】:

      【解决方案3】:

      这意味着作为评论,作为答案发布,因为评论系统不适合发布代码示例。使用列表推导有两个很好的答案,我想补充讨论生成器和生成器表达式。

      虽然列表推导式比您的函数短,但它的可读性也可能较差。另一种方法是使用生成器:

      def make_attributes(attributes, attributenames):
          for attribute in attributes:
              if attribute['internalname'] in attributenames:
                  attr = Attribute();
                  attr.name = attribute['internalname']
                  attr.value = attribute['value']
                  yield attr
      

      还有生成器表达式(在您并不真正需要真实列表的情况下使用这些来代替列表推导,例如,当您只是迭代结果时):

      # borrowing create_attribute from Martijn Pieters
      return (
          create_attribute(attr['internalname'], attr['value'])
          for attr in attributes 
          if attr['internalname'] in attributenames
      )
      

      【讨论】:

        猜你喜欢
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 2022-12-22
        • 1970-01-01
        • 2015-04-05
        • 2010-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多