2015-11-17 11 views
2

我想用包含过滤器函数和lambda的术语“FX”来过滤列表中的项目。这工作得很好:过滤python列表,同时将未过滤的术语耦合到其他列表。

MarketnoFX=list(filter(lambda x: "FX" not in x, Openmarket)) 

然而,这个名单必须与含数值其他两个列表,所以说,如果第x项从该列表中省略(通过创建一个新的列表),则必须也可以从其他两个列表中省略。我通常会简单地使用列表解析。

Openmarket=[someitems] 
coupled1=[] 
coupled2=[] 

    for item in Openmarket: 
     if "FX" in item: 
      pass 
     else: 
      someotherlist.append(item) 
      k=Openmarket.index(entry) 
      someotherotherlist.append(coupled1[k]) 

然而,这样做不会产生正确的结果,并在打印包含“FX”项目的指标,我得到例如,它表明这是两次发现的第12和第33条款,以及第71届只有一次。

过滤器功能看起来像是一种更优雅的做事方式,但是如何将它与其他列表结合呢?我已阅读过有关zip函数的信息,但我不确定如何在此处应用它。我不是一个非常有经验的Python程序员。

谢谢。

回答

1

你是对的,使用zip()是解决这个问题的好方法。

基本上,它可能需要三个列表,并在同一时间遍历每个第n个元素,所以这在这里非常有用。

由于它返回元组列表,因此可以过滤它以保留第一个值(这是Openmarket中的元素)不包含FX的元组。来自someotherlistsomeotherotherlist的元素同时被过滤。

最后,您可以通过“解压缩”元组列表来取回您的初始列表,这要归功于解包。

的Python 2

zipped = zip(Openmarket, someotherlist, someotherotherlist) 
filtered = filter(lambda (a, b, c): "FX" not in a, zipped) 
Openmarket, someotherlist, someotherotherlist = zip(*filtered) 

的Python 3

zipped = list(zip(Openmarket, someotherlist, someotherotherlist)) 
filtered = list(filter(lambda elems: "FX" not in elems[0], zipped)) 
Openmarket, someotherlist, someotherotherlist = zip(*filtered) 
+0

我使用Python 3.5(我应该在这个问题说明这一点),所以在你的第一行代码,我认为对我来说需要: zipped = list((zip(Opendeal,Openresult,Openmarket))) – Hanadulset

+0

@Hanadulset你是对的。这是因为'zip()'从Python 3开始返回一个zip对象,而之前它是一个简单的列表。 – Delgan

+0

我其实打算进一步扩大,但按下输入发表评论我的沮丧。 我打算上写: 我使用Python 3.5(我应该在这个问题说明这一点),所以在你的第一行代码,我认为我将需要: 压缩=名单((ZIP( Opendeal,Openresult,Openmarket))) 所以我试过: zipped = list((zip(Opendeal,Openresult,Openmarket))) zipped =(filter(lambda a,b,c:“FX”not in c *压缩)) 这将产生: 类型错误:过滤器预计2个论点,得到了200 顺便说一句,什么是你的代码的第三行,和什么呢: 拉链(*拉链)呢? – Hanadulset