Python for 循环覆盖

标签 python for-loop overwrite

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

相关文章:

python - 在 Python 仿真中使用嵌入式 C 库

python - 在不破坏内容的情况下重命名 python 3.7 可执行文件

python - 我不知道如何让 __slots__ 工作

java - 使用数组和列表的正确循环构造

python - 如何以编程方式创建 django `models.Textchoices`?

r - 高效修改R中的列表

c - for循环中的if语句 - 无限循环

reactjs - 如何从继承类覆盖 React.Component 状态类型?

linux - 在 Linux 中以编程方式创建的文件变为 NULL

Java:HashMap 中的对象作为值被覆盖?