【问题标题】:Python: Compare the key against the values of each key pair values in a dictionary based on the type set in a separate dictionaryPython:根据单独字典中设置的类型将键与字典中每个键对值的值进行比较
【发布时间】:2019-07-10 17:47:39
【问题描述】:

给定两个单独的示例字典:

fruit_type = {'apple': 'stonefruit', 'peach': 'stonefruit', 'pear': 'stonefruit','orange': 'citrus', 'lemon': 'citrus', 'tangerine': 'citrus'}
similar_fruit = {'apple': ['peach', 'pear'], 'peach': ['apple', 'pear'], 'pear': ['apple', 'peach'], 'orange': ['lemon', 'tangerine'], 'lemon': ['orange', 'tangerine'], 'tangerine': ['orange', 'lemon']}

根据另一个字典 fruit_type 中的值比较每个键与 similar_fruit 字典中的值的最有效方法是什么?

我在下面有一个看起来很幼稚的工作实现:

same_type = False

for fruit in similiar_fruit:
  for comparison in similiar_fruit[fruit]:
    if fruit_type[fruit] == fruit_type[comparison]:
      same_type = True

请注意,始终只有 2 种水果(核果、柑橘),并且第一个字典中的键与第二个字典中的键在相同的键(苹果、 peach, pear, orange, lemon, tangerine),不一定是键的顺序。

提前谢谢你。

【问题讨论】:

  • 您的示例简洁明了。但是你在寻找什么结果?显然,在运行上面的代码之后,你最终会得到“same_type == True”,这不是很有趣。您是否希望获得某些特定的数据结构?或者您只是在寻找内部 if 子句失败的情况?这似乎是真正有趣的结果,从您的示例数据来看,您希望所有测试都能成功,对吧?如果是这样,在您的数据中包含一个失败案例会更好(我没有错过它,是吗?)
  • 因此,目标是返回布尔值以检查 similar_fruit 键是否与基于 fruit_type 的值匹配,以确保例如水果束可以存放在一起的东西。所以是的,我正在检查内部子句是否失败,其中组合将不是一个可行的捆绑包。话虽如此,是的,对于这种情况,数据中的失败案例将是首选。
  • 哈!认为这样。因此,如果您将上述代码放入一个函数中,如果比较失败则返回 False,并在底部返回 True,那么您将拥有一个可以为您提供所需结果的函数,对吗?那么这是一个更有效算法的问题,是吗?
  • 是的,完全正确
  • 注意始终只有两种水果可能会有所帮助,并且第一个字典中的键与第二个字典中的键在相同的键方面对齐,而不是必须是键的顺序。

标签: python dictionary


【解决方案1】:

我不相信有任何其他方法可以简化它!但是,我将更改起始same_type = True,并将比较为:

if fruit_type[fruit] != fruit_type[comparison]:
  same_type = False
  break

这样一旦比较不正确,内部子句就会失败以防止比较覆盖,并停止循环。

另外,如果您想简单地为每种水果创建一个字典并列出它们相似的水果,而不是从两个字典开始进行比较,我在这里编写了一个代码来完成此操作:

fruit_type = {'apple': 'stonefruit', 'peach': 'stonefruit', 'pear': 'stonefruit','orange': 'citrus', 'lemon': 'citrus', 'tangerine': 'citrus'}
similar_fruits = {}

for fruit in fruit_type:
  similar = []
  for comp in fruit_type:
    if fruit != comp:
      if fruit_type[fruit] == fruit_type[comp]:
        similar.append(comp)
  similar_fruits[fruit] = similar

print(similar_fruits)

similar_fruits 将成为所有水果的自动字典,并列出与它们相似的每种水果。 {'apple': ['peach', 'pear'], 'peach': ['apple', 'pear'], 'pear': ['apple', 'peach'], 'orange': ['lemon', 'tangerine'], 'lemon': ['orange', 'tangerine'], 'tangerine': ['orange', 'lemon']}

希望这会有所帮助! -内特

【讨论】:

    【解决方案2】:

    然后将每个水果与每个相似的水果配对:

    similar_pairs = [(f,sim) for f,sims in similar_fruit.items() for sim in sims]
    

    现在询问这对的两个成员是否属于同一类型:

    for a,b in similar_pairs:
        if fruit_type[a] == fruit_type[b]:
            print(f"{a} and {b} are similar and the same kind")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 2022-09-23
      • 2022-11-03
      • 1970-01-01
      相关资源
      最近更新 更多