通过保留两个其他列表的比较顺序来返回一个列表的元素的Python方法



我有三个列表:vals1vals2namesnames仅包含字符串,而其他两个列表(vals1vals2(仅包含数字。三个列表的长度总是相同的。我的目标是编写一个比较vals1vals2的函数,并根据比较结果返回消息或列表。如果vals1vals2相等,则函数将返回一条消息,说明这两个列表相等。列表比较必须按保留的顺序进行。例如,vals1 = [1,2,3,2]不等于vals2 = [1,2,2,3]。如果两个数字列表(vals1vals2(不相等,函数将返回一个包含元组的列表。该列表中的每个元组包含vals1vals2中不相等的一个元素、字符串列表names中的对应元素和vals1中的对应元件的索引。这是我为这个任务编写的函数:

def compareLists(l1, l2, names):
if l1==l2:
return "Equal"
else:
return ([(item, idx, val) for (item, idx, val) in 
zip(names, range(len(names)), l1) if l1[idx]!=l2[idx]])

对于

vals1=[12, 2, 2, 7, 5]
vals2=[12, 5, 2, 7, 15]
names=['a','b','c','d','e']

compareLists将返回

[('b', 1, 2), ('e', 4, 5)]

该函数有效,但我想知道是否有更有效的方法(更Python的方法(。如有任何帮助,我们将不胜感激。

你的方法没有错,imo.

或者,您可以使用zip+enumerate:

out = [(n, idx, i) for idx, (i, j, n) in enumerate(zip(vals1, vals2, names)) if i!=j]
out = out if out else 'equal'

如果您有Python>3.8,你也可以把上面的内容写在一行中(可读性要差得多(:

out = out if (out:= [(n, idx, i) for idx, (i, j, n) in enumerate(zip(vals1, vals2, names)) if i!=j]) else 'equal'

输出:

[('b', 1, 2), ('e', 4, 5)]

我们也可以写一个genexp(感谢@JonClements(:

t = ((n, idx, i) for idx, (i, j, n) in enumerate(zip(vals1, vals2, names)) if i!=j)
out = 'equal' if vals1 == vals2 else list(t)

我建议使用enumerate(),而不是使用range()。您也可以删除函数中的else,因为它是多余的:

def compareLists(l1, l2, names):
if l1 == l2:
return "Equal"
return ([(item, idx, val) for idx, (item, val) in 
enumerate(zip(names, l1)) if l1[idx] != l2[idx]])
vals1=[12, 2, 2, 7, 5]
vals2=[12, 5, 2, 7, 15]
names=['a','b','c','d','e']
print(compareLists(vals1, vals2, names))

相关内容

  • 没有找到相关文章

最新更新