比较特定列表中具有不同索引量和相同条件的嵌套列表

Compare Nested List With Different Index Amount and Same Condition in Particular List

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

问:

我有两个嵌套列表和结果

data1 = [
    ["tr1", 1002, 6798381], # return false
    ["tr1", 1001, 6798381], # return false
    ["tr1", 1001, 6798381], # return false
    ["tr1", 1000, 6798381], # return vid1
    ["tr1", 1000, 6798381], # return vid2 (can be vid1, but vid1 already used) | But I got False
    ["tr2", 1200, 6798382], # vid3
    ["tr4", 1200, 6798384], # vid5
    ["tr5", 1200, 6798385], # false
    ["tr3", 1200, 6798383], # vid4
]

data2 = [
    ["tr1", 1000, 6798381, "vid1"],
    ["tr1", 1000, 6798381, "vid2"],
    ["tr2", 1200, 6798382, "vid3"],
    ["tr3", 1200, 6798383, "vid4"],
    ["tr4", 1200, 6798384, "vid5"]
] 

如果值相同,我需要将 Data2 最后一个索引(Data2[-1] 即 vid1 或 vid2 等)移动到 data1 中,但如果 data2 vid 已经被占用,我应该删除,这样我就不会从 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")

我从代码中得到的输出

    false
    false
    false
    vid1
    False (should be vid1 or vid2, but vid1 already used so should be vid2)
    vid3
    vid5
    false
    vid4

我期望的输出

    false
    false
    false
    vid1
    vid2
    vid3
    vid5
    false
    vid4

or

false
    false
    false
    vid2 --
    vid1 --
    vid3
    vid5
    false
    vid4

编辑预期结果: 而不是打印 vid/false 您可以移动到 data1 吗?

["tr1", 1002, 6798381], # return false
    ["tr1", 1001, 6798381, 'false'], # return false
    ["tr1", 1001, 6798381, 'false'], # return false
    ["tr1", 1000, 6798381, 'vid1'], # return vid1
    ["tr1", 1000, 6798381, 'vid2'], # return vid2 (can be vid1, but vid1 already used) | But I got False
    ["tr2", 1200, 6798382, 'vid3'], # vid3
    ["tr4", 1200, 6798384, 'vid5'], # vid5
    ["tr5", 1200, 6798385, 'false'], # false
    ["tr3", 1200, 6798383, 'vid4'], # vid4

你们能帮我吗?谢谢

python 数组列表 list-推导 嵌套列表

评论


答:

1赞 blhsing 9/6/2023 #1

由于并共享相同的密钥,因此最好构建列表词典以跟踪相同密钥的视频。迭代键时,从 中弹出当前键的子列表中的 vid 以防止重用。输出 if 是从不存在的键引发的,或者如果是从已耗尽的子列表引发的:vid1vid2data1'false'KeyErrorIndexError

data = {}
for *key, vid in data2:
    data.setdefault(tuple(key), []).append(vid)
output = []
for key in map(tuple, data1):
    try:
        vid = data[key].pop()
    except (KeyError, IndexError):
        vid = 'false'
    output.append([*key, vid])

output成为:

[['tr1', 1002, 6798381, 'false'],
 ['tr1', 1001, 6798381, 'false'],
 ['tr1', 1001, 6798381, 'false'],
 ['tr1', 1000, 6798381, 'vid2'],
 ['tr1', 1000, 6798381, 'vid1'],
 ['tr2', 1200, 6798382, 'vid3'],
 ['tr4', 1200, 6798384, 'vid5'],
 ['tr5', 1200, 6798385, 'false'],
 ['tr3', 1200, 6798383, 'vid4']]

演示:在线试用!