我有以下列表和嵌套列表:
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
我如何实现这一目标?
答案 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键和列表之间的区别。