Python:比较一个列表和一个元组列表

2024-04-23 08:35:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我的清单如下:

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

我怎样才能得到我想要的?你知道吗


Tags: 代码informattjohnlowerwordinc
3条回答

试试这个:

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   
]

对于这种类型的过滤/列表操作问题,列表理解是一种优雅的方法。你知道吗

理解包括三个部分:

-首先在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']

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

相关问题 更多 >