将元组转换为set以便在python中的if-in语句中使用?

将元组转换为set以便在python中的if-in语句中使用?,python,if-statement,set,tuples,Python,If Statement,Set,Tuples,我有一个元组,看起来像b(u'3.7',9023)。我想在下面的语句中使用它: if list(self.ballot_number) == msg.ballot_number and b in waitfor: print "hello" 我已经检查过了,if的气球编号部分工作正常。第二部分不是真的。waitfor集合如下所示:集合([((u'3.0',9002),(u'3.1',9005),(u'3.2',9008),(u'3.3',9011),(u'3.4',9

我有一个元组,看起来像
b(u'3.7',9023)
。我想在下面的语句中使用它:

 if list(self.ballot_number) == msg.ballot_number and b in waitfor:
          print "hello"  
我已经检查过了,if的气球编号部分工作正常。第二部分不是真的。waitfor集合如下所示:
集合([((u'3.0',9002),(u'3.1',9005),(u'3.2',9008),(u'3.3',9011),(u'3.4',9014),(u'3.5',9017),(u'3.6',9020),(u'3.7',9023))

元组的值在集合中,但可能由于不同的数据类型,它们无法匹配我不想将元组拆分为单独的元素,因为我以后必须在代码中集体使用它。如何运行if语句

集合的构建

waitfor = set()
    print "in scout"
    for a in self.acceptors:
      print "acceptor",a
      a = tuple(tuple(p) for p in self.acceptors)      
      waitfor.add(a)
      print "waitfor",waitfor

集合中的括号太多,因此它只查找单个元素

len(waitfor)
# 1
如果您尝试:

waitfor = set([(u'3.0', 9002), (u'3.1', 9005), (u'3.2', 9008), (u'3.3', 9011), (u'3.4', 9014), (u'3.5', 9017), (u'3.6', 9020), (u'3.7', 9023)])
然后你的测试:

(u'3.7', 9023) in waitfor
# True

会有用的

问题在于,您没有构建您认为正在构建的集合,因此无法按您希望的方式使用它

您的代码执行以下操作:

waitfor = set()
print "in scout"
for a in self.acceptors:
  print "acceptor",a
  a = tuple(tuple(p) for p in self.acceptors)      
  waitfor.add(a)
  print "waitfor",waitfor
因此,对于每个接受体,您不是将该接受体添加到集合中,而是将所有接受体的元组添加到集合中。你一遍又一遍地这样做,但是因为它是一个集合,你一遍又一遍地添加同一个元组,你只得到一个元素,所有接受体的大元组。这正是您所看到的,请注意输出中的额外括号,以及如果您打印出
len(waitfor)
它仅为1

这意味着,您稍后在waitfor中使用
p检查的
p
值都不会出现在
waitfor
中,因为其中唯一实际存在的是包含所有这些对的巨型元组,而不是任何对本身

这就像在电话簿上加上数百万次“加利福尼亚州”,而不是加上数百万加利福尼亚人,然后问“杰瑞·布朗在电话簿上吗?”不,他没有。在如何搜索电话簿中没有任何错误;错误出现在创建电话簿的过程中。这就是你需要修复的部分

所以,你想要的是:

waitfor = set()
print "in scout"
for a in self.acceptors:
  print "acceptor",a
  waitfor.add(tuple(a))
print "waitfor",waitfor
或者,更简单地说,这一行:

print “in scout”
waitfor = set(tuple(p) for p in self.acceptors)
print “waitfor”, waitfor
或者,如果您的Python版本对于集合理解来说足够新(我认为这意味着2.7,但不要引用我的话),那么它的可读性会稍微好一些:

print “in scout”
waitfor = {tuple(p) for p in self.acceptors}
print “waitfor”, waitfor

waitfor
似乎是一组元组或一组对。因此,没有一对是该集合的元素。我怀疑您首先真的想构建一组对,而构建该对的代码就是bug所在的位置,但您没有向我们展示该代码。变量
waitfor
是一个包含一个元组和多个元组的集?如果这是正确的,您可以在next(iter(waitfor))[0]中执行
b操作。
如果该集合实际上是正确的/有用的,但在这里并不有用,您可以执行类似
any(b in elem for elem in waitfor)
的操作。当然,这是一个线性搜索。也许您真正想要的是构建一个用于搜索的平面集,比如
waitset={pair for tup in waitfor for pair in tup}
,然后您可以在waitset中执行
b
。但是,我认为最有可能的事情是,您构建了错误的集合。@jdehesa没有列表。在较旧的Python版本中,集合的repr是
set([elem,elem,…])
,因为集合构造函数接受元素列表(或其他iterable)。@abarnert我已经添加了构建集合的代码,我正在自动向集合添加值