2016-03-29 111 views
2

这是我在Python 3代码:的Python for循环覆盖

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开头,它将打印出成功。非常感谢!

回答

3

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

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

或存储的字符串列表:

firstNode =["134", "135"] 

,如果你想找到,如果any匹配,你创建firstNode,你可以使用str.startswith这可以采取一个子串的元组来尝试和匹配,如果我们在eac之后添加.^h元素,我们会得到确切的匹配:

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将在第一场比赛短路,如果没有匹配它会返回False,集合L ookups是O(1)因此对于大量的数据将是一个非常有效的解决方案。

+0

thx为彻底的答案! –