Python for循环覆盖

时间:2016-03-29 22:58:19

标签: python-2.7 python-3.x for-loop overwrite

这是我在Python 3中的代码:

firstNode =[134, 135]
USAdetail =['134.250.7.8', '1.39.35.138', '100.43.90.10','101.43.90.10', '101.43.90.11']
for each in USAdetail:
   if each.split('.')[0] in firstNode:
       print ("successful")

我认为它应该打印出来"成功"因为有一个" 134"在USAdetail。然而,它似乎是覆盖,而且USAdetail中的最后一个元素以" 101"开头,这就是为什么它不打印"成功"。

我只是想知道如何更改代码以确保USAdetail中有任何以134/135开头的元素,它会打印成功。非常感谢!

1 个答案:

答案 0 :(得分:3)

你需要强制转换为int,字符串"134"不等于整数134

if int(each.split('.')[0]) in firstNode:

或在列表中存储字符串:

firstNode =["134", "135"]

如果您想查找any是否匹配并且您创建 firstNode ,则可以使用str.startswith,如果我们添加,可以使用子串的元组来尝试匹配在每个元素之后.我们将完全匹配:

USAdetail =['134.250.7.8', '1.39.35.138', '100.43.90.10','101.43.90.10', '101.43.90.11']
firstNode = ("134.", "135.")

if any(x.startswith(firstNode ) for x in USAdetail):
    print("Successful")

或者将它们存储为set中的字符串并使用in

USAdetail =['134.250.7.8', '1.39.35.138', '100.43.90.10','101.43.90.10', '101.43.90.11']
firstNode = {"134", "135"}

if any(x.split(".",1)[0] in firstNode for x in USAdetail):
     print("Successful")

如果你不控制firstnode创建,你可以坚持使用int转换为int并从firstnode创建一个集合:

USAdetail =['134.250.7.8', '1.39.35.138', '100.43.90.10','101.43.90.10', '101.43.90.11']
firstNode = [134, 135]

st = set(firstNode)
if any(int(x.split(".",1)[0]) in  st for x in USAdetail):
      print("Successful")

any会在第一场比赛中发生短路,如果没有比赛,它将返回False,设置查找为O(1),因此对于大量数据将是一个非常有效的解决方案。

相关问题