我在Python中有一个如下所示的列表:
myarray = [('31.10', 'John', 'Smith', 'ZK'),('01.11', 'John', 'Smith', 'OK'),('31.10', 'John', 'Doe', 'ZK'),('01.11', 'John', 'Doe', 'ZK')]
我想按2键过滤。 2个名称键。
离。过滤myarray包含John和Doe得到:
01.11 John Doe ZK
31.10 John Doe ZK
答案 0 :(得分:1)
您需要测试列表中的每个元组:
for entry in myarray:
if entry[1:3] == ('John', 'Doe'):
print ' '.join(entry)
我使用切片来选择那里的索引1
和2
的部分,但你也可以使用元组解包:
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
答案 1 :(得分:1)
这里有很好的讨论原则: 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函数返回一个生成器,可以正常调用。