【问题标题】:How can I find 2-tuples with a specific first element in the set of 2-tuples?如何在 2 元组集中找到具有特定第一个元素的 2 元组?
【发布时间】:2018-12-26 05:02:44
【问题描述】:

我有一组类型为 (str, int) 的对。我将找到包含特定字符串的元组,然后将相应的整数加 1。我知道如何通过询问是否 myTuple in mySet 来查找集合中的元组。但我不知道如何处理这种情况。我将不胜感激。

这是一个示例集:

from sets import Set
up = 2
down = 3
right = 1
left = 2
mySet = Set([("up",up),("down",down),("right",right),("left",left)])

mySet 说,我想将第一个元素为 "up" 的对中的第二个增加 1,所以我需要类似

if ("up",ref) in mySet:
    ref += 1 

通过这样做,我想增加原始变量 up 的值和元组的第二个元素。

【问题讨论】:

  • 为什么不使用字典呢?
  • @Sergey Pugach 看来字典也不能解决我的问题。
  • 看下面@Sharu的解决方案,看来字典可以解决你的问题。

标签: python set pattern-matching tuples


【解决方案1】:

我建议根据您的目的使用字典。这样,新计数的重新分配会更干净,更容易解释。例如:

>>> my_set = { 'up': 0, 'down': 0, 'left': 0, 'right': 0 }
>>> my_set['up'] += 1
>>> my_set
{'up': 1, 'down': 0, 'left': 0, 'right': 0}

正如 Brian 所描述的,元组是不可变的,因此每次更新计数时,都必须使用更新后的计数创建一个新元组。然后可以使用它来替换旧的元组。

【讨论】:

  • 这对我来说完全有道理,字典似乎是他需要的东西。
  • 谢谢,还请注意,在我的示例中,一对的第二个元素不是文字而是变量。
  • @Tripoli,应该可以正常工作。我看到这已经解决了,但是是的,您可以简单地使用变量引用而不是文字值来更新计数。
【解决方案2】:

您可以使用过滤器方法查找集合中您的条件的所有条目,在这种情况下,第一个条目“up”为真。

subset = list(filter(lambda x: x[0] == "up", mySet))
for entry in subset:
    mySet.remove(entry)
    newEntry = (entry[0],(entry[1]+1))
    mySet.add(newEntry)
    up +=1 

你不能使用entry+=1,因为元组在python中是不可变的

【讨论】:

  • 其实我想增加变量的值和元组的第二个元素。
  • “变量”是指原始示例中的 up = 2 吗?
  • 是的,我是这么说的。
  • 您也可以在 for 循环中执行此操作。我编辑了我的帖子以包括在内。然而,这是一个相当不优雅的解决方案,因为它需要在两个单独的变量中跟踪相同的数据,并且此代码仅适用于 up 情况,而不适用于任何其他情况,无需每次将 up+=1 行更改为不同的变量
猜你喜欢
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 2021-01-24
  • 2019-12-06
  • 1970-01-01
相关资源
最近更新 更多