Python - извлекает значения, когда условия выполняются, используя логическую переменную - PullRequest
0 голосов
/ 05 октября 2018

Я извлекаю данные из таблицы, и мне нужно найти код товара, который удовлетворяет всем 4 условиям.Например, у меня есть lat и long для этого элемента, lat должен быть в этом диапазоне, а long должен находиться в другом диапазоне, и мне нужно извлечь соответствующие коды элементов, которые удовлетворяют обоим ограничениям.Используя этот код элемента, я буду искать соответствующее значение в другом словаре.

update: я работал над своими сценариями, и вот что у меня сейчас, словарь (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 голосов
/ 05 октября 2018

Здесь на самом деле происходит пара вещей.

Во-первых, вы не можете сравнить строку с целым числом.Например:

my_str = "65"
print(my_string < 65)  # <-- RESULTS IN A `TypeError`

Это одна из причин, почему очень важно, чтобы мы точно знали, какова ваша структура данных.Просто сказать, что это кортеж, список или словарь, на самом деле недостаточно.Я бы посоветовал взглянуть на Как создать пример Minimal, Complete и Verifiable .

С учетом сказанного, что, чем вы разбиваете строку, мы можем предположить, что значение, возвращаемое из итерациив списке также есть строка, но это может быть не самый эффективный способ достичь того, что вы пытаетесь сделать.

Во-вторых, в вашем коде есть опечатка.Я предполагаю, что вы пытаетесь проверить, если 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")

будет обеспечивать базовое «да, * одинарное совпадение найдено во всей структуре данных whole », но будет постоянно выводить «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, чтобы увидеть, есть ли у него значение, которое даст истинный или ложный результат.

0 голосов
/ 05 октября 2018

Как говорит ваш заголовок, вы можете использовать булеву переменную, чтобы отслеживать, были ли найдены какие-либо совпадения, и проверять ее после цикла, чтобы напечатать сообщение "нет совпадения" или нет:

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")
...