Python:比较列表和元组列表

Python:比较列表和元组列表,python,list,Python,List,我的清单如下所示: z = [('Anna Smith', 'IN1'), ('John', 'IN2'), ('Matt Andrew', 'IN3'), ('Smith', 'IN4')] 以及另一份名单: c = ['Anna Smith', 'John', 'Anna', 'Smith'] 我想要以下输出: o = ['Anna Smith|IN1', 'John|IN2', 'Smith|IN4'] 我尝试了以下代码: for s, s_inc in z: for wo

我的清单如下所示:

z = [('Anna Smith', 'IN1'), ('John', 'IN2'), ('Matt Andrew', 'IN3'), ('Smith', 'IN4')]
以及另一份名单:

c = ['Anna Smith', 'John', 'Anna', 'Smith']
我想要以下输出:

o = ['Anna Smith|IN1', 'John|IN2', 'Smith|IN4']
我尝试了以下代码:

for s, s_inc in z:
     for word in c:
          if word.lower() in s.lower():
                o.append("%s|%s"%(word, s_inc))
但上面给出的结果是:

o = ['Anna Smith|IN1', 'Anna|IN1', 'Smith|IN1', 'John|IN2', 'Smith|IN4']

如何获得我想要的?

从您的示例中,您似乎在寻找精确匹配,因此只需使用
==
而不是
中的

for s, s_inc in z:
     for word in c:
          if word == s:
                o.append("%s|%s"%(word, s_inc))
或更短,作为单个列表:

o = ["%s|%s"%(s, s_inc) for s, s_inc in z if s in c]
在这之后,
o
['Anna Smith'IN1','John'IN2','Smith'IN4']
试试这个:

z = [('Anna Smith', 'IN1'), ('John', 'IN2'), ('Matt Andrew', 'IN3'), ('Smith', 'IN4')]
c = set(['Anna Smith', 'John', 'Anna', 'Smith'])

o = [
    '|'.join([name, code]) for name, code in z if name in c   
]
我会制作
c
一套,用于快速恒定时间测试:

c_set = {w.lower() for w in c}
我降低了单词的大小写,以便在不敏感的情况下测试成员资格

然后使用:

for s, s_inc in z:
    if s.lower() in c_set:
        o.append('|'.join([s, s_inc]))
甚至:

o = ['|'.join([s, s_inc]) for s, s_inc in z if s.lower() in c_set]
使用列表理解生成整个列表

演示:


对于这种类型的筛选/列表操作问题,列表理解是一种优雅的方法

理解包括三个部分:

-首先,在a+'|'+b中构造结果

-其次,a和b被分配给列表z中每个2元组中的第一个和第二个元素

-第三,我们在a必须是列表c的成员的条件下进行过滤

print [a+'|'+b for a,b in z if a in c]

# Prints ['Anna Smith|IN1', 'John|IN2', 'Smith|IN4']

此外,如果word==s是合适的条件,那么您似乎想要相等,而不是检查-如果word==s是合适的条件,那么请使用列表理解:
['|'
@MartijnPieters我想要一个精确匹配的输出,当存在时…当不存在时,部分匹配。一些(简要)解释这是如何工作的,以及它的确切作用可以使答案更有用。注意要点。补充解释。
>>> z = [('Anna Smith', 'IN1'), ('John', 'IN2'), ('Matt Andrew', 'IN3'), ('Smith', 'IN4')]
>>> c = ['Anna Smith', 'John', 'Anna', 'Smith']
>>> ['|'.join([i,x[1]]) for x in z for i in c if x[0]==i]
['Anna Smith|IN1', 'John|IN2', 'Smith|IN4']
print [a+'|'+b for a,b in z if a in c]

# Prints ['Anna Smith|IN1', 'John|IN2', 'Smith|IN4']