【问题标题】:how to extend the list in python without empty items如何在没有空项的情况下在python中扩展列表
【发布时间】:2014-03-19 05:46:49
【问题描述】:

我正在使用这样的查询集扩展列表:

a_objs = MyModelOne.objects.filter(name__icontains=term)
b_objs = MyModelTwo.objects.filter(name__icontains=term)


l = []
l.extend( (list(a_objs), list(b_objs)) )

但由于a_objs 为空,我得到一个列表列表:[ [], [<MyModelOne: blabla>] ]

我怎样才能以某种很酷的方式避免那些空列表? :)

【问题讨论】:

  • 首先,用一个空列表覆盖列表类型。
  • 他想说的是你不应该使用'list'作为名称,因为它是内置类型。
  • @JayanthKoushik 哦,谢谢提示。

标签: python django list


【解决方案1】:
my_list.extend(y for y in (list(x) for x in (a_objs, b_objs)) if y)

【讨论】:

    【解决方案2】:

    你真的需要一个列表列表吗?为什么不用源列表中的结果来扩展目标列表,如果您尝试添加一个空列表,这将没有副作用。

    a_objs = []
    b_objs = ['hello', 'world']
    
    l = []
    l.extend(a_objs)
    l.extend(b_objs)
    
    print l
    

    【讨论】:

      【解决方案3】:

      要过滤掉虚假信息(例如空列表),no_falsies = filter(None, to_filter)

      l = filter(None, l)
      

      【讨论】:

      • 最好一开始就避免将“falsies”添加到列表中,而不是稍后添加和删除它们。
      • 同意。虽然仍然是一个有效的选择。我发现它非常清晰/具有人类可读的价值。
      • @Yuji'Tomita'Tomita 是的,这是非常好的和清晰的。谢谢人
      【解决方案4】:

      list.extend 只接受一个参数,您将其作为 2 元组提供。这本身就被放入了一个列表中,所以这就是你的问题。

      >>> l = []
      >>> l.extend((list(''), list('def')))
      >>> l
      [[], ['d', 'e', 'f']]
      

      现在,如果您想将多个列表连接在一起,您可以使用 itertools.chain,它会为您完成此操作。

      >>> list(itertools.chain(list(''), list('def')))
      ['d', 'e', 'f']
      

      【讨论】:

      • 使用l 作为变量名通常也被认为是不好的做法,因为它很容易与I1 混淆(我在这里违反了),但比覆盖内置更好类型。
      • 最好使名称尽可能明确。
      • @metatoaster,是的,我只是在这篇文章中这样做是为了说明清楚。在我的真实代码中是res_list。 :)
      猜你喜欢
      • 2014-03-03
      • 2018-08-19
      • 2022-11-17
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多