【问题标题】:Python for loop overwritingPython for 循环覆盖
【发布时间】:2016-07-17 17:38:44
【问题描述】:

这是我在 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 开头的元素,它会打印成功。非常感谢!

【问题讨论】:

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


    【解决方案1】:

    需要强制转换为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 并从 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),因此对于大量数据将是一个非常有效的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多