Python for循环覆盖

Python for loop overwriting

这是我在 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")

我认为它应该打印出来 "successful" 因为在 USADetail 中有一个“134”。但是,它似乎正在覆盖并且 USAdetail 中的最后一个元素以“101”开头,这就是它没有打印 "successful".

的原因

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

需要转换成int,字符串"134"不等于整数134:

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

或者在列表中存储字符串:

firstNode =["134", "135"]

如果你想找到 if any match and you create firstNode, you can use 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 并从 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 会在第一个匹配时短路,如果没有匹配它会 return 错误,设置查找是 O(1) 所以对于大量数据将是一个非常有效的解决方案。