Python:如何确定dictionaries.values()中是否包含无序元组列表?

时间:2018-07-18 15:25:23

标签: python list dictionary tuples

我正在尝试遍历一个字典,并确定在迭代过程中该值是否存在于第二个字典中。这些值是在列表项中具有元组坐标的列表。当我运行以下预期结果不会返回。我可能做错了什么?


o={123:[(2045414.2025330812, 737011.67879535258), (2045345.5412850082, 736965.27060331404)]}
t={234:[(2053962.2499010414, 731325.2501180619), (2053955.6251330376, 731121.18739786744)]}
y={345:[(2045414.2025330812, 737011.67879535258), (2045345.5412850082, 736965.27060331404)]}
h={456:[(2045345.5412850082, 736965.27060331404), (2045414.2025330812, 737011.67879535258)]}


for k, v in o.items():
    if v in h.values():
        print k, v

2 个答案:

答案 0 :(得分:1)

如果您表示元组列表本身是无序的,则可能是因为您正在将vh.values()中的内容进行比较,但是其中h.values()有列表以不同的顺序。为什么不简单地将集合存储为值?

checker = set(list(map(set, h.values))
for k, v in o.items():
    if set(v) in checker:
        print(k,v)

也许您可以以此格式创建数据结构,以避免不必要的开销。

答案 1 :(得分:0)

您正在比较元组的有序列表。要比较无序的元组集合,可以使用set

for k, v in o.items():
    if set(v).issubset(set(next(iter(h.values())))):
        print(k, v)

123 [(2045414.2025330812, 737011.6787953526), (2045345.5412850082, 736965.270603314)]

编写上述逻辑的另一种方法:

for k, v in o.items():
    if set(v) <= set(list(h.values())[0]):
        print(k, v)

棘手的部分是将dict.values()转换为set。由于h只有一个值,因此在转换为set之前,您需要提取唯一的值。