我正在从表中提取数据,我需要找到满足所有4个条件的商品代码。例如,我有此项目的纬度和经度,纬度需要在此范围内,而纬度必须在另一个范围内,并且我需要提取同时满足这两个约束条件的相应项目代码。使用此商品代码,我将在另一本词典中查找其对应的值。
更新: 我正在编写脚本,这就是我现在所拥有的,这里的字典(dict)是在上一步中定义的,因此这里没有任何缺失。我现在拥有的代码可以打印两个符合条件的记录,但也可以打印“不匹配”。 如何解决此问题,以便在满足条件的情况下仅打印满足条件的记录,在不满足条件的情况下打印“不匹配”(仅一行,不对所有行进行迭代)?
谢谢!
for lstr in llist:
ldata = lstr.split(',')
item = ldata[0]
LatA = ldata[1]
LongA = ldata[2]
LatB = ldata[3]
LongB = ldata[4]
if (LatA < 0 and LatB > 0 and LongA > 65 and LongA < 70):
value = dict[item]
print(something)
else:
print("no match")
答案 0 :(得分:0)
正如您的标题所述,您可以使用布尔变量来跟踪是否找到了任何匹配项,并在循环之后进行检查以显示“不匹配”消息:
match_found = False
for lstr in llist:
ldata = lstr.split(',')
item = ldata[0]
LatA = ldata[1]
LongA = ldata[2]
LatB = ldata[3]
LongB = ldata[4]
if (LatA < 0 and LatB > 0 and LongA > 65 and LongA < 70):
value = dict[item]
print(something)
match_found = True
if not match_found:
print("no match")
答案 1 :(得分:0)
这里实际上发生了几件事。
首先,您不能将字符串与整数进行比较。例如:
my_str = "65"
print(my_string < 65) # <-- RESULTS IN A `TypeError`
这是我们准确了解您的数据结构非常重要的原因之一。仅仅说它是一个元组,列表或字典是远远不够的。我建议您看看How to create a Minimal, Complete, and Verifiable example。
话虽如此,鉴于您正在分割一个字符串,因此我们可以假定迭代遍历列表返回的值也是一个字符串,但这可能不是实现您要执行的操作的最有效方法。
第二,您的代码中有错字。我假设您正在尝试测试LatA
小于零,LatB
大于零,LongA
大于65以及 LongB
小于70;但是您的if语句正在测试LongA
是否大于65并小于70。
第三,上面的代码实际上不是有效的代码,对您问题的简短回答是“是”和“否”,这取决于您要测试的是什么以及期望的结果是什么。例如:
llist = [
"item1, -5, 70, 5, 65", # MEETS CRITERA
"item2, 5, 60, -5, 75", # DOES NOT MEET CRITERA
]
match_found = False
value = ""
for lstr in llist:
ldata = lstr.split(',')
item = ldata[0]
LatA = int(ldata[1])
LongA = int(ldata[2])
LatB = int(ldata[3])
LongB = int(ldata[4])
if LatA < 0 and LatB > 0 and LongA > 65 and LongB < 70:
# This will get reassigned on each match. Try using
# value += {item}. There is also no need for a dict,
# you could simply use a *list* (not tuple).
value = {item}
print("Match Found")
match_found = True
if not match_found:
print("No Match Found")
将提供一个基本的“是,在整个数据结构中找到一个单个匹配项”,但将连续为您的每个条目打印“找到匹配项”符合您条件的列表,然后重新分配变量value
。您可以通过删除打印语句来避免这种情况,除非您绝对需要它。也许更好的方法是使用字典,例如:
# [LatA, LongA, LatB, LongB]
my_dict = {
"Location #1": [-5, 70, 5, 65],
"Location #2": [5, 60, -5, 75],
}
my_matches_list = []
for location, coords in my_dict.items():
if coords[0] < 0 and coords[1] > 65 and coords[2] > 0 and coords[3] < 70:
my_matches_list.append(location)
if my_matches_list:
print("Matches Found:")
for match in my_matches_list:
print(" - ", match)
else:
print("No Matches Found")
# Matches or No Matches Found Response...
# print("Matches Found" if my_matches_list else "No Matches Found")
一旦您填充了my_matches_list
,就可以使用这些值与字典进行比较。但是,这可能不是您想要的,但它甚至可以消除多个列表或词典来帮助减少混乱。
最后,如果您需要使代码与发布的代码大致相同,并且需要比是或否更多的功能结果,则可以执行以下操作:
llist = [
"item1, -5, 70, 5, 65", # MEETS CRITERA
"item2, -1, 75, 10, 15", # MEETS CRITERA
"item3, 5, 60, -5, 75", # DOES NOT MEET CRITERA
]
matched_values = list()
for lstr in llist:
ldata = lstr.split(',')
item = ldata[0]
LatA = int(ldata[1])
LongA = int(ldata[2])
LatB = int(ldata[3])
LongB = int(ldata[4])
if LatA < 0 and LatB > 0 and LongA > 65 and LongB < 70:
matched_values.append(item) # += [item] works too, but not preferred.
if matched_values:
print("Matches Found:")
for match in matched_values:
print(" - ", match)
else:
print("No Matches Found")
这将仅测试matched_values
列表以查看其是否具有值,该值将提供对还是错的结果。