比较两个具有不同索引量的嵌套列表

Compare Between Two Nested List With Different Index Amount

提问人:Yogyakartas 提问时间:9/5/2023 最后编辑:Yogyakartas 更新时间:9/6/2023 访问量:102

问:

我有两个嵌套列表:

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]]

python python-3.x 列表 嵌套列表

评论


答:

0赞 nicholaspooran 9/5/2023 #1

您可以尝试:

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")

评论

0赞 Yogyakartas 9/5/2023
输出: false false vid1 false --> 应该是 vid2 ([“tr1”, 1000, 6798381]) vid3 false
1赞 RomanPerekhrest 9/5/2023 #2

只需比较等效大小的切片:

for x1, x2 in zip(data1, data2):
    print(x1 == x2[: len(x1)])

True
True
True
False
1赞 Goku - stands with Palestine 9/5/2023 #3

创建跳过data2_without_vidvids

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
2赞 blhsing 9/5/2023 #4

您可以将两个列表映射到函数以进行比较。由于当任何输入序列用完时会停止迭代,因此第二个子列表的第四项将不包括在比较中:zipoperator.eqmap

from operator import eq

for a, b in zip(data1, data2):
    print(all(map(eq, a, b)) and b[3])

这输出:

vid1
vid2
vid3
False

演示:在线试用!

评论

0赞 Yogyakartas 9/5/2023
当我在数据 1 中添加“false”数据时,输出将全部为 false,只返回 4rows,它应该是 amount与data1中的索引金额相同
0赞 blhsing 9/5/2023
我不明白您所说的“在数据 1 中添加'虚假'数据”和“金额与数据 1 中的索引金额相同”是什么意思。请使用示例输入和您尝试说明的场景的预期输出来更新您的问题,以澄清您的问题。
0赞 Yogyakartas 9/5/2023
在列表 data_1 中添加项,其中数据将返回 false,例如:[“tr13”, 2000, 777777]。它将返回 false,因为该数据不在data_2中。好的,我也会更新问题
0赞 Yogyakartas 9/5/2023
我已经更新了问题。尝试更改 data1 : data1 = [[“tr1”, 1001, 6798381],[“tr1”, 1001, 6798381],[“tr1”, 1000, 6798381], [“tr1”, 1000, 6798381], [“tr2”, 1200, 6798381], [“tr4”, 1200, 6798381]]
0赞 Arifa Chan 9/5/2023 #5

将 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

评论

0赞 Yogyakartas 9/5/2023
你能返回 vid1/vid2/vid3/vid4/ 而不是 True 吗?
0赞 Yogyakartas 9/6/2023
它几乎完成了,但是当我使用更新数据时,我的代码中出现了错误。我已经添加了更新数据。添加此数据时结果不匹配。
0赞 Arifa Chan 9/6/2023
代码已更新...