Python-使用布尔变量提取条件为真时的值

时间:2018-10-04 22:13:32

标签: python python-3.x loops if-statement boolean

我正在从表中提取数据,我需要找到满足所有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")

2 个答案:

答案 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列表以查看其是否具有值,该值将提供对还是错的结果。