【问题标题】:Python: How do you determine if a list of unordered tuples is IN a dictionaries.values()?Python:你如何确定一个无序元组列表是否在 dictionaries.values() 中?
【发布时间】:2018-07-18 15:25:23
【问题描述】:

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


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

【问题讨论】:

  • o 的值不在h 中。 if v in y.values(): 会返回一些东西。顺序很重要。

标签: python list dictionary tuples


【解决方案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)

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

【讨论】:

    【解决方案2】:

    您正在比较一个有序的元组列表。要比较一个无序的元组集合,可以使用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之前需要提取唯一的值。

    【讨论】:

    • 我应该早点指出,但我分享的代码是我面临的问题的一个过度简化的例子。字典将有多个键/值对来检查。如果字典只有一个键,您提供的解决方案确实有效,但我无法让它与多个键一起使用
    • @JeffLong,鉴于您在这里有 2 个答案,您能否发布一个带有另一个最小(且具有代表性!)示例的单独问题?您可以模拟一些简单的数据,例如浮点数可以是 1.5 而不是 435235235.4325325432532565
    猜你喜欢
    • 2012-03-28
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    相关资源
    最近更新 更多