Python for循环覆盖[重复]

3hvapo4f  于 2023-04-04  发布在  Python
关注(0)|答案(1)|浏览(127)

此问题在此处已有答案

(32个答案)
两个月前关门了。
下面是我在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开头的元素,它将成功打印出来。非常感谢!

vlju58qv

vlju58qv1#

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

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

或在列表中存储字符串:

firstNode =["134", "135"]

如果你想找到是否有匹配,你可以使用string.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创建一个set:

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),因此对于大量数据将是非常有效的解决方案。

相关问题