2013-03-19 2 views
0

У меня есть список кортежей, например.Я ищу список кортежей для 3 строк

[('ABC', 'Abcair', 1.50), ('DEF', 'Defir', 5.60), ('GHI', 'Ghiair',3.22), ('ANZ', 'Anzplace', 26.25), ('ARG', 'Argair', 12.22), ('CEN', 'Cenair', 11.22), ('CNU', 'Cununun',3.01)] 

У меня есть команда ввода как такой

code_input = input('Please list portfolio: ').upper() 

Если лицо будет вводить любое количество 3-буквенных кодов, разделенных запятой, который я тогда формат, используя

no_spaces_codes = code_input.replace(" ", "") 
code_list = no_spaces_codes.split(",") 

So , "Ank , ABc,DEF" будет ['ANK', 'ABC', 'DEF']

Затем я печатаю эти заголовки формы atted

header="{0:<6}{1:<20}{2:>8}".format("Code","Place","Number") 
print(header) 

, то мне нужно искать список кортежей для 3-х буквенных кодов и печать значения под заголовков отформатированы так же, как, например, и коды не в списке, не будут напечатаны.

Code Name     Price 
ABC Abcair     5.30 
DEF Defair     11.22 

Я получил это далеко.

for code in b: 
    if code[0] == (code_list[1]): 
     print(code[:]) 
     break 

который печатает

Code Name     Price 
('CEN', 'Contact', 11.22) 

Но я не могу дальше, чем это.

ответ

1
result = [v for v in list_of_tuples if v[0] in code_list] 
for v in result: 
    print(v) # Or format 'v' tuple in any way you want. 
3

Вы можете сделать это с помощью:

place, price = next((c[1:] for c in b if c[0] == code_input), ('Not found', 0)) 

но вы действительно хотите использовать словарь вместо:

code_dict = {k: (v, p) for k, v, p in b} 

, после чего соответствующий становится простой поиск:

place, price = code_dict.get(code_input, ('Not found', 0)) 

Демонстрация:

>>> b = [('ABC', 'Abcair', 1.50), ('DEF', 'Defir', 5.60), ('GHI', 'Ghiair',3.22), ('ANZ', 'Anzplace', 26.25), ('ARG', 'Argair', 12.22), ('CEN', 'Cenair', 11.22), ('CNU', 'Cununun',3.01)] 
>>> code_input = 'CEN' 
>>> place, price = next((c[1:] for c in b if c[0] == code_input), ('Not found', 0)) 
>>> print code_input, place, price 
CEN Cenair 11.22 
>>> code_dict = {k: (v, p) for k, v, p in b} 
>>> place, price = code_dict.get(code_input, ('Not found', 0)) 
>>> print code_input, place, price 
CEN Cenair 11.22 

code_dict С отображением, поиски будут намного быстрее при выполнении несколько Lookups, особенно, когда есть несуществующие записи в списке. Для того, чтобы положить это вместе с остальной частью кода:

code_input = input('Please list portfolio: ').upper() 
code_dict = {k: (v, p) for k, v, p in b} 

line="{0:<6}{1:<20}{2:>8}" 
print line.format("Code", "Place", "Number") 

for code in code_input.split(','): 
    code = code.strip() 
    if code not in code_dict: 
     continue # skip codes not in the mapping 
    place, price = code_dict[code] 
    print line.format(code, place, price) 

Что для "Ank , ABc,DEF" ввода напечатает:

Code Place     Number 
ABC Abcair     1.5 
DEF Defir     5.6 
+0

По вопросу, code_input может быть список из нескольких ключей. – Dhara

+0

@Dhara: вы можете легко перебирать «code_input» и работать * на каждый код ввода *. –

+0

Я знаю, это просто, когда OP удалось найти и распечатать результаты для одного входного_кода, он, похоже, столкнулся с остальными кодами ввода. Возможно, вам следует отредактировать, как это сделать в ответ. – Dhara

Смежные вопросы