提问人:Yogyakartas 提问时间:9/5/2023 最后编辑:Yogyakartas 更新时间:9/6/2023 访问量:102
比较两个具有不同索引量的嵌套列表
Compare Between Two Nested List With Different Index Amount
问:
我有两个嵌套列表:
data1 = [["tr1", 1000, 6798381], ["tr1", 1000, 6798381], ["tr2", 1200, 6798381], ["tr4", 1200, 6798381]]
data2 = [["tr1", 1000, 6798381, "vid1"], ["tr1", 1000, 6798381, "vid2"], ["tr2", 1200, 6798381, "vid3"], ["tr3", 1200, 6798381, "vid4"]]
data2_but_same_index = [["tr1", 1000, 6798381], ["tr1", 1000, 6798381], ["tr2", 1200, 6798381], ["tr3", 1200, 6798381]]
然后我将在它们之间进行比较,但仅在 3 个第一个索引中。因为当它返回 true 时,它将采用 data2 列表中的第四个索引。
当索引数量相同时,我期望的回报(比较 data1 和 data2_but_same_index)
data1 = [["tr1", 1000, 6798381], ["tr1", 1000, 6798381], ["tr2", 1200, 6798381], ["tr4", 1200, 6798381]]
data2 = [["tr1", 1000, 6798381, "vid1"], ["tr1", 1000, 6798381, "vid2"], ["tr2", 1200, 6798381, "vid3"], ["tr3", 1200, 6798381, "vid4"]]
data2_but_same_index = [["tr1", 1000, 6798381], ["tr1", 1000, 6798381], ["tr2", 1200, 6798381], ["tr3", 1200, 6798381]]
for x in data1 :
if x in data2_without_vid :
print("true")
else :
print("false")
输出将返回:
true
true
true
false
我希望我能像这样比较data_1和data_2,但返回是列表(vid1/vid2/vid3/vid4)中每个列表的第四个索引(如果data_2)
更新数据 :
data1 = [[“tr1”, 1001, 6798381],[“tr1”, 1001, 6798381],[“tr1”, 1000, 6798381], [“tr1”, 1000, 6798381], [“tr2”, 1200, 6798381], [“tr4”, 1200, 6798381]]
更新数据新 : data1 = [[“tr3”, 1200, 6798381], [“tr1”, 1001, 6798381],[“tr1”, 1001, 6798381],[“tr1”, 1000, 6798381], [“tr1”, 1000, 6798381], [“tr2”, 1200, 6798381], [“tr4”, 1200, 6798381]]
答:
您可以尝试:
data2_dict = {(item[0], item[1], item[2]): item[3] for item in data2}
for x in data1:
key = (x[0], x[1], x[2])
if key in data2_dict:
print(data2_dict[key])
else:
print("false")
更新:
data2_dict = {(item[0], item[1], item[2]): item[3] for item in data2}
for x in data1:
key = (x[0], x[1], x[2])
if key in data2_dict:
print(data2_dict[key])
# Remove the key from data2_dict to prevent reuse
del data2_dict[key]
else:
print("false")
评论
只需比较等效大小的切片:
for x1, x2 in zip(data1, data2):
print(x1 == x2[: len(x1)])
True
True
True
False
创建跳过data2_without_vid
vids
data2_without_vid = [x[:-1] for x in data2]
print(data2_without_vid)
#output
[['tr1', 1000, 6798381],
['tr1', 1000, 6798381],
['tr2', 1200, 6798381],
['tr3', 1200, 6798381]]
现在,comp[就像你所做的那样:
for x in data1 :
if x in data2_without_vid :
print("true")
else :
print("false")
#output
true
true
true
false
您可以将两个列表映射到函数以进行比较。由于当任何输入序列用完时会停止迭代,因此第二个子列表的第四项将不包括在比较中:zip
operator.eq
map
from operator import eq
for a, b in zip(data1, data2):
print(all(map(eq, a, b)) and b[3])
这输出:
vid1
vid2
vid3
False
演示:在线试用!
评论
将 data2 切片到 3 第一个索引:
data1 = [["tr1", 1001, 6798381],["tr1", 1001, 6798381],["tr1", 1000, 6798381], ["tr1", 1000, 6798381], ["tr2", 1200, 6798381], ["tr4", 1200, 6798381]]
data2 = [["tr1", 1000, 6798381, "vid1"], ["tr1", 1000, 6798381, "vid2"], ["tr2", 1200, 6798381, "vid3"], ["tr3", 1200, 6798381, "vid4"]]
print(*[x in [i[:3] for i in data2] for x in data1], sep='\n')
# False
# False
# True
# True
# True
# False
更新#1:
for i, x in enumerate(data1):
print(data2[i-2][-1] if x in [d[:3] for d in data2] else False)
# False
# False
# vid1
# vid2
# vid3
# False
更新#2:
data1 = [
["tr1", 1002, 6798381],
["tr1", 1001, 6798381],
["tr1", 1001, 6798381],
["tr1", 1000, 6798381],
["tr1", 1000, 6798381],
["tr2", 1200, 6798381],
["tr4", 1200, 6798381],
["tr5", 1200, 6798381]
]
data2 = [
["tr1", 1000, 6798381, "vid1"],
["tr1", 1000, 6798381, "vid2"],
["tr2", 1200, 6798381, "vid3"],
["tr3", 1200, 6798381, "vid4"],
["tr4", 1200, 6798381, "vid5"]
]
m = False
for x in data1:
if x in (temp := [d[:3] for d in data2]):
i, m = (temp.index(x,1), False) if m else (temp.index(x), True)
print(data2[i][-1])
else: print(m)
# False
# False
# False
# vid1
# vid2
# vid3
# vid5
# False
评论