这是我在 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")
我认为它应该打印出“成功”,因为 USAdetail 中有一个“134”。然而,它似乎被覆盖了,USAdetail 中的最后一个元素以“101”开头,这就是它没有打印“成功”的原因。
我只是想知道如何更改代码以确保 USAdetail 中是否有任何以 134/135 开头的元素,它将成功打印出来。非常感谢!
最佳答案
需要转换为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")
如果您不控制第一个节点的创建,您可以坚持强制转换为 int 并从第一个节点创建一个集合:
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)
因此对于大量数据将是一个非常有效的解决方案。
关于Python for 循环覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36296611/