Python for loop overwriting
Question:
Here is my code in 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")
I thought it should print out “successful” since there is a “134” in USAdetail. However, it seems like it is overwriting and the last element in USAdetail starts with “101”, and that’s why it did not print “successful”.
I’m just wondering how I could change the code to make sure if there is any element in USAdetail that starts with 134/135, it would print out successful. Many thanks!
Answers:
You need to cast to int, the string "134"
is not equal to the integer 134
:
if int(each.split('.')[0]) in firstNode:
Or store strings in the list:
firstNode =["134", "135"]
if you want to find if any match and you create firstNode, you can use str.startswith which can takes a tuple of substrings to try and match, if we add a .
after each element we will get exact matched:
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")
Or store them as strings in a set and use 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")
If you don’t control firstnode creation you can stick to casting to int and make a set from 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
will short circuit on the first match, if there are no matches it will return False, set lookups are O(1)
so for large amounts of data will be a very efficient solution.
Here is my code in 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")
I thought it should print out “successful” since there is a “134” in USAdetail. However, it seems like it is overwriting and the last element in USAdetail starts with “101”, and that’s why it did not print “successful”.
I’m just wondering how I could change the code to make sure if there is any element in USAdetail that starts with 134/135, it would print out successful. Many thanks!
You need to cast to int, the string "134"
is not equal to the integer 134
:
if int(each.split('.')[0]) in firstNode:
Or store strings in the list:
firstNode =["134", "135"]
if you want to find if any match and you create firstNode, you can use str.startswith which can takes a tuple of substrings to try and match, if we add a .
after each element we will get exact matched:
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")
Or store them as strings in a set and use 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")
If you don’t control firstnode creation you can stick to casting to int and make a set from 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
will short circuit on the first match, if there are no matches it will return False, set lookups are O(1)
so for large amounts of data will be a very efficient solution.