2015-10-25 30 views
-2

我有一个Python列表,看起来像这样:过滤Python列表

myarray = [('31.10', 'John', 'Smith', 'ZK'),('01.11', 'John', 'Smith', 'OK'),('31.10', 'John', 'Doe', 'ZK'),('01.11', 'John', 'Doe', 'ZK')] 

我想用2个键来进行过滤。 2个名称键。

ex。过滤myarray中包含John和能源部获得:

01.11 John Doe ZK 
31.10 John Doe ZK 
+0

你有一个包含元组的列表。你有没有尝试过自己呢? –

+0

我尝试了许多不同的结果=过滤器(lambda x:x [0]是“Doe”,myarray),但我甚至不能用一个键过滤它。 输出结果只有[] – John

+1

那么你在这种情况下输出的结果是什么?请在你的问题中添加这个内容,它有助于构建上下文,并让我们知道你已经知道了多少。你可以[编辑]它。 –

回答

0

这里有原则很好的讨论: List filtering: list comprehension vs. lambda + filter

稍微使其适应于您的问题:

def filterbyvalue(seq, position, value): 
    for el in seq: 
     if el[position]==value: yield el 

myarray = [('31.10', 'John', 'Smith', 'ZK'),('01.11', 'John', 'Smith', 'OK'),('31.10', 'John', 'Doe', 'ZK'),('01.11', 'John', 'Doe', 'ZK')] 

results = filterbyvalue(myarray, 2, "Doe") 
for x in results: 
    print(x) 

的filterbyvalue函数返回一个生成器,它可以被称为正常。

+0

这对我有用。非常感谢你 – John

0

你需要在列表中,以测试每个元组:

for entry in myarray: 
    if entry[1:3] == ('John', 'Doe'): 
     print ' '.join(entry) 

我用切片只选择在指数12零件那里,但你也可以使用元组拆包:

for num1, first, last, token in myarray: 
    if (first, last) == ('John', 'Doe'): 
     print num1, first, last, token 

,或者如果元组的平等还没有清晰你做什么的,用不同的比较和and

for num1, first, last, token in myarray: 
    if first == 'John' and last == 'Doe': 
     print num1, first, last, token