转换元组设置为在python中的if-in语句中使用?

时间:2018-03-07 10:10:28

标签: python if-statement set tuples

我有一个看起来像if的元组。我想在以下声明中使用它:

b (u'3.7', 9023)

我已经检查过,if条件的选票部分很好。它是第二部分没有回归真实。 waitfor集如下所示: if list(self.ballot_number) == msg.ballot_number and b in waitfor: print "hello"

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

建立集合

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))])

2 个答案:

答案 0 :(得分:0)

您的套装中有太多括号,所以它只查找单个元素。

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

会工作!

答案 1 :(得分:0)

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

您的代码执行此操作:

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的事实。

这意味着您之后使用p检查的p in waitfor值都不会出现在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