【问题标题】:Convert For Loop to List Comprehension: Testing if elements in list 2 are partial match for elements in list 1将 For 循环转换为列表理解:测试列表 2 中的元素是否与列表 1 中的元素部分匹配
【发布时间】:2014-03-06 09:21:31
【问题描述】:

这里有点python/编程新手,

我已经提出了 2 个嵌套 for 循环的代码,以测试第二个循环的元素是否与第一个列表中的元素部分(或完全)匹配,如果是,则将这些元素从第一个列表。代码如下:

>>> lst = ["my name is Bob Jenkins", "Tommy Cooper I am", "I be Bazil", "I Tarzan"]
>>> names = ["Bob", "Tarzan"]
>>> for l in lst:
        for n in names:
            if n in l:
                lst.remove(l)


>>> print lst
['Tommy Cooper I am', 'I be Bazil']

这里的问题是我实际上并不想修改lst,而是创建一个新列表。因此,列表理解抬起了头。但是,我无法弄清楚列表理解来实现这一点。我试过[i for i in lst for n in names if n not in i] 但这不起作用。当然.remove 方法不适用于列表理解。在过去的一个小时里,我一直在困惑,但什么也想不出来。

有什么想法吗?

【问题讨论】:

  • 这不是对您问题的回答,而是对您当前解决方案的评论:您不应该在迭代列表时修改列表(例如删除元素)。您可以遍历它的副本,例如:for l in lst[:]: lst.remove(l)
  • 感谢您提供的信息@Lazarus - 非常有帮助
  • 我发现所有 3 个答案(到目前为止)都同样有用,因此我无法在这方面选择它们作为最佳答案。但是,我会接受darkryder,原因很简单,他/她需要一些积分:-)
  • 它们几乎是等价的。

标签: python list for-loop list-comprehension


【解决方案1】:

你去 :) :

lst = ["my name is Bob Jenkins", "Tommy Cooper I am", "I be Bazil", "I Tarzan"]
names = ["Bob", "Tarzan"]

new=[a for a in lst if all(x not in a for x in names) ]
print new

【讨论】:

    【解决方案2】:

    我会使用 any 内置函数:

    newlst = [i for i in lst if not any(name in i for name in names)]
    

    如果你愿意,这个使用all 的表达式是等价的:

    newlst = [i for i in lst if all(name not in i for name in names)]
    

    【讨论】:

      【解决方案3】:

      为了完整起见,filter:

      filter(lambda s: not any(x in s for x in names),lst)
      Out[4]: ['Tommy Cooper I am', 'I be Bazil']
      

      对于 python 3,list(filter):

      list(filter(lambda s: not any(x in s for x in names),lst))
      Out[4]: ['Tommy Cooper I am', 'I be Bazil']
      

      【讨论】:

        猜你喜欢
        • 2018-04-15
        • 1970-01-01
        • 2023-02-12
        • 1970-01-01
        • 2011-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-20
        相关资源
        最近更新 更多