我有一个看起来像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))])
答案 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