Python:比较列表和元组列表

3

我有一个如下所示的列表:

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']

我该如何获得我想要的东西?


为什么您要使用小写成员资格测试,当您似乎想要测试整个匹配时。 - Martijn Pieters
此外,您似乎想要相等性,而不是检查 - 如果单词== s,则是适当的条件。 - GoingTharn
使用列表推导式:['|'.join((i,t)) for i in c for k,t in z if k==i] ['Anna Smith|IN1', 'John|IN2', 'Smith|IN4'] - Mazdak
@MartijnPieters 我想要一个精确匹配的输出,当存在时...而不匹配部分时。 - user1452759
5个回答

2
列表推导式是解决这种过滤/列表操作问题的一种优雅方法。
推导式由三个部分组成:
- 首先,在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']

简要解释一下这个程序是如何工作的,以及它确切的功能,可以使答案更有帮助。 - ssube
知道了,已添加解释。 - Moose

0
从你的例子来看,似乎你在寻找一个完全匹配,所以只需使用==而不是in
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']


0

试试这个:

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   
]

0

我会将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]

使用列表推导式生成整个列表。

示例:

>>> z = [('Anna Smith', 'IN1'), ('John', 'IN2'), ('Matt Andrew', 'IN3'), ('Smith', 'IN4')]
>>> c = ['Anna Smith', 'John', 'Anna', 'Smith']
>>> c_set = {w.lower() for w in c}
>>> ['|'.join([s, s_inc]) for s, s_inc in z if s.lower() in c_set]
['Anna Smith|IN1', 'John|IN2', 'Smith|IN4']

0
>>> 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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接