2016-09-27 3 views
0

Новое в программировании. Я пытаюсь создать программу, которая имеет список списка o (в качестве базы данных), первым элементом является счет-фактура, второй - значением этого счета, а третий - маржей дохода. С учетом счета-фактуры (ввода) он будет выполнять поиск в списках списков (база данных).Поиск элемента в списке списка Python

я в настоящее время:

Data_base= [["f1",2000,.24],["f2",150000,.32],["f3",345000,.32]] 
invoice = input("Enter invoice: ") 

if invoice in data_base : 
    print ("Invoice is valid") 

else : 
    print("Invoice does not exist, enter a valid document: ") 

Когда я запустить программу и я ввести действительный элемент в списке, он не признает в качестве элемента в списке.

Что я делаю неправильно?

Каким должен быть код, если элемент находится в списке списков?

+0

Вы имеете дело со списком списков. Итак, ваше условие 'if invoice in data_base' не будет достаточным. Вам нужно будет перебирать ваш список, а затем использовать это условие. – idjaw

ответ

1

in ключевое слово в Python используется для проверки принадлежности элемента в iterator. То есть каждый элемент iterator проверяется операндом и возвращает значение True, если операнд существует в iterator.

Ключевое слово in специально ищет счет-фактуру в data_base, который является списком. Теперь, это другая история, что каждый элемент этого списка является другим списком.

Линия if invoice in data_base : делает следующее, Say пользовательского ввод был «f1» сейчас «f1» сравниваются с списком ["f1",2000,.24] что

"f1" == ["f1",2000,.24], который является ложным, вы предполагаете, что это должно вернуться True но это не так, поскольку строка «f1» не равна списку ["f1",2000,.24].

затем

"f1" == ["f2",150000,.32] который Ложные

и, наконец,

"f1" == ["f3",345000,.32] который также значение False.

Вы по существу сравниваете счет-фактуру (пользовательский ввод) со всем элементом, а не только с первым элементом элемента.

Эта программа должна дать правильный результат.

Data_base= [["f1",2000,.24],["f2",150000,.32],["f3",345000,.32]] 
invoices_db = [ele[0] for ele in Data_base] 
invoice = input("Enter invoice: ") 
if invoice in invoices_db : 
    print ("Invoice is valid") 
else : 
    print("Invoice does not exist, enter a valid document: ") 

Для получения более подробной информации см ответа на Use and meaning of "in" in an if statement in python

1

Если вы хотите выполнить поиск по номеру счета-фактуры, лучше структуры данных использовать это словарь. Используйте номер счета в качестве ключа, а значение счета и маржу в качестве значений. Пример:

invoices = {'f1': [2000, .24], 
      'f2': [150000, .32], 
      'f3': [345000, .32]} 

invoice = input("Enter invoice: ") 
if invoice in invoices: 
    value, margin = invoices[invoice] 
    print('Invoice {} is valid. Value {}, margin {}'.format(invoice, value, margin)) 
else: 
    print("Invoice does not exist, enter a valid document: ") 

Теперь, когда вы говорите invoice in invoices Python будет искать номер счета-фактуры в ключам словаря. По сравнению с поиском в списке это очень эффективная операция (O (1) против O (n)).

0

Вот решение, которое я нашел:

data_base = [["f1",2000,.24],["f2",150000,.32],["f3",345000,.32]] 
invoice = input("Enter invoice: ") 

found = False 

for data in data_base: 
    if invoice == data[0]: 
     found = True 
     break 

result = "Invoice is valid" if found else "Invoice does not exist, enter a valid document: " 

print(result) 

Во-первых, вы должны повторять во всех data_base элементов, а затем проверить, если первый элемент является счет-фактура вы ищете.

0
Data_base= [["f1",2000,.24],["f2",150000,.32],["f3",345000,.32]] 

invoice = 2000 

result = [i for i in Data_base if i[1] == invoice] 

for item in result: 

    print item 
+1

Всегда добавляйте некоторые пояснения к своему коду ... – andreas

+0

Счет-фактура - это входное значение, и я просто установил номер исправления. и использовать счет-фактуру для фильтрации данных из data_base. result = [i для i в Data_base, если i [1] == invoice] – Howardyan