Python:比较列表和元组列表

时间:2014-12-19 14:38:21

标签: 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 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']

我如何得到我想要的东西?

5 个答案:

答案 0 :(得分:2)

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

理解包括三个部分:

- 首先,结果是在+' |' + b

中构建的

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

- 第三,我们过滤了必须是列表c

的成员的条件
print [a+'|'+b for a,b in z if a in c]

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

答案 1 :(得分: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']

答案 2 :(得分: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   
]

答案 3 :(得分: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']

答案 4 :(得分: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']