如何获取与其值列表子集匹配的键列表

时间:2021-06-03 09:16:55

标签: python dictionary

我已经定义了一些三角形和它们的质心坐标,以及它们顶点的索引,并将所有这些放在一个字典中,一般顺序是:{'triangle_id': centroid-coordinates(x,y,z), [list of vertices]}。所以填充了一些示例数字:

test_dict = {'1': [15.3, 9.1, 0.0, [1, 2, 3]], '2': [20.1, 10.3, 5.0, [2, 3, 4]], '3': [19.7, 0.0, 20.9, [2, 7, 8]]}

现在我尝试获取包含嵌套值列表值的所有键的列表,例如

# value to match: val = 3
['1', '2']

到目前为止,我尝试了 this tutorialthis one 中的示例。但它没有找到任何东西。我得到的只是一个错误,告诉我该值不存在,或者什么都没有。 我试图通过对 test_dict.values()[3] 下标来访问特定的值部分,但这不起作用,因为 test_dict.values() 不可下标(也尝试了 test_dict.values[3]()) 相同的结果)。

是否可以从我的值列表中访问嵌套的点列表?或者我是否必须将这些顶点作为简单条目放入我的字典的值列表中?

我已经从另一个函数中以列表的形式获取了这些顶点,这就是我以这种方式将它们放在字典中的原因。

3 个答案:

答案 0 :(得分:1)

我只能想到一个非常丑陋的方法来解决这个问题。 您可以编写一个函数,并创建一些列表。 一个用于存储键的列表,一个用于存储值的子列表。 使用相同的键创建一个新字典,但只有子列表作为值,

最后检查该值是否出现在其中一个键值中,如果是,则将该键附加到一个新列表中,迭代完成后,返回结果列表。

这应该有效:

def dummy(d,k):
    only_sub = []
    key_list = list(d.keys())
    new_d = {}
    res = []


    for item in list(d.values()):
        for sublist in item:
            if type(sublist) == list:
                only_sub.append(sublist)

    for i,j in zip(key_list,only_sub):
        new_d|={i:j}

    for item in only_sub:
        if k in item:
            res.append(key_list[only_sub.index(item)])
    
    return res


print(dummy({'1': [15.3, 9.1, 0.0, [1, 2, 3]],
 '2': [20.1, 10.3, 5.0, [2, 3, 4]], '3': [19.7, 0.0, 20.9, [2, 7, 8]]},3))

注意:如果我没记错的话,new_d |= {i:j} 只能在 python 3.9 中工作。

在其他版本中,将该行重写为 new_d[i]=j

答案 1 :(得分:1)

试试...

test_dict = {'1': [15.3, 9.1, 0.0, [1, 2, 3]], '2': [20.1, 10.3, 5.0, [2, 3, 4]], '3': [19.7, 0.0, 20.9, [2, 7, 8]]}
val = input('Enter Value : ')
keys = {k:[a for a in v[3] if a == int(val)] for k,v in test_dict.items()}
keyss = {k:v for k,v in keys.items() if v}
result = [i for i in keyss.keys()]
print(result)

答案 2 :(得分:0)

dict.values()[3]

中有错误

dict.values()[3] 中的键应该是 dict['3']

并且也不要使用 dict 作为变量。因为它是一个内置关键字