我已经定义了一些三角形和它们的质心坐标,以及它们顶点的索引,并将所有这些放在一个字典中,一般顺序是:{'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 tutorial 和 this one 中的示例。但它没有找到任何东西。我得到的只是一个错误,告诉我该值不存在,或者什么都没有。
我试图通过对 test_dict.values()[3]
下标来访问特定的值部分,但这不起作用,因为 test_dict.values()
不可下标(也尝试了 test_dict.values[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 作为变量。因为它是一个内置关键字