列出循环中的比较:如果条件,则打印第二个元组元素

时间:2018-05-03 11:44:03

标签: python

我有以下列表和嵌套列表:

first_var = ["id1","id2","id3"]
second_var = [("id1","name1"),("id2","name2"),("id3","name3"),("id4","name4"),]

我想检查'second_var'中'first_var'中不存在的每个第一个元素,并打印'second_var'中的第二个元素。

我的代码是:

for x in [x[0] for x in second_var]:
    if x not in first_var:
        print(...)

现在如果我执行print(x)它会打印:

id4

但我需要打印 name4

我如何实现这一目标?

4 个答案:

答案 0 :(得分:2)

您可以使用list comprehension功能。

ids = [tuple[1] for tuple in second_var if tuple[0] not in first_var]
print(ids)

输出

['name4']

上面的列表理解陈述相当于:

>>> result = []
   for tuple in second_var:
      if tuple[0] not in first_var:
         result.append(tuple[1])

>>> result
['name4']

答案 1 :(得分:2)

>>> [v[1] for v in second_var if v[0] not in first_var]
['name4']

答案 2 :(得分:2)

您的代码存在的问题是您没有迭代原始列表。您只是迭代列表中每个元组的第一个条目。

这是您调整代码的方法:

first_var = ["id1","id2","id3"]
second_var = [("id1","name1"),("id2","name2"),("id3","name3"),("id4","name4"),]

for x in second_var:
    if x[0] not in first_var:
        print(x[1])

Pythonic解决方案是将其转换为列表理解:

values = set(first_var)
res = [x[1] for x in second_var if x[0] not in values]

for item in res:
    print(item)

或功能版;不推荐,但另一种看待逻辑的方式:

from operator import itemgetter

values = set(first_var)
res = map(itemgetter(1), filter(lambda x: x[0] not in values, second_var))

答案 3 :(得分:1)

如果你有很多数据,你需要建立一个字典&使用set& Python中已经存在的所有漂亮的散列/差异技术,而不是列表中的线性查找(O(1) vs O(n))。

first_var = ["id1","id2","id3"]
second_var = [("id1","name1"),("id2","name2"),("id3","name3"),("id4","name4"),]

second_d = dict(second_var)  # create a dict directly from tuples

missing = set(second_d).difference(first_var)
for m in missing:
    print(second_d[m])

这会打印name4

missing是dict键和列表之间的区别。