2013-03-26 12 views
-1

В Python 3 у меня есть список кортежей, содержащих различные записи, скажем, это называется alpha_data. Они изложены следующим образом: [('A', 'Apple', 14.5), ('B', 'Banana', 23.4) и т. Д.]Сравнение ввода пользователя с кортежем

Есть ли способ, которым пользователь может ввести значение аналогично первому значению кортежа (например, A или B), и программа проверяет, существует ли это значение, и распечатайте все вложенное значение, если это произойдет? Пример:

Input: A

Output: A Apple 14.5

Есть также способ, которым это может быть изменен таким образом, пользователь может несколько значений входных и он проверяет и печатает их все? Например:

Input: A, B

Output:

A Apple 14.5 
    B Banana 23.4 

EDIT: Может быть, мне нужно быть немного яснее. У меня есть код, который получает вход и преобразует его в список нескольких записей. Затем я получил строку, которая печатает 3 значения кортежа так, как мне это нужно. Все, что мне нужно, чтобы объединить эти две части.

Вот мой код до сих пор:

import shares 
portfolio_str=input("Please list portfolio: ") 
portfolio_str= portfolio_str.replace(' ','') 
portfolio_str= portfolio_str.upper() 
portfolio_list= portfolio_str.split(',') 
print(portfolio_list) 
print() 
print('{:<6} {:<20} {:>8}'.format('Code', 'Name', 'Price')) 
data=shares.EXCHANGE_DATA 
for (code, name, share_value) in data: 
    if code == portfolio_list[]: 
      print('{:<6} {:<20} {:>8.2f}'.format(code, name, share_value)) 
    else: 
      print("Failure") 

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

EXCHANGE_DATA = [('AIA', 'Auckair', 1.50), 
      ('AIR', 'Airnz', 5.60), 
      ('AMP', 'Amp',3.22), 
      ('ANZ', 'Anzbankgrp', 26.25), 
      ('ARG', 'Argosy', 12.22), 
      ('CEN', 'Contact', 11.22), 
      ('CNU', 'Chorus',3.01), 
      ('DIL', 'Diligent', 5.3), 
      ('DNZ', 'Dnz Property', 2.33), 
      ('EBO', 'Ebos', 1.1), 

Теперь, как мне получить его, чтобы проверить на любое значение в пользовательском вводе и распечатать любой из них?

+0

Хорошо, вы можете объяснить, что вы пробовали до сих пор? Ваш вопрос не показывает никаких исследовательских усилий в противном случае (-1). – nneonneo

+0

Я отредактировал его сейчас – jevans

ответ

4

Получение записи заданной некоторые входные "A" или "B" довольно просто:

alpha_data = [('A', 'Apple', 14.5), ('B', 'Banana', 23.4)] 

user_input = "A" 

[rec for rec in alpha_data if rec[0] == user_input] 
Out[4]: [('A', 'Apple', 14.5)] 

Но если ваша цель состоит в том, чтобы разрешить пользователям доступа к этим записям с помощью "A", "B" и т.д., то dict кажется, тем больше разумное решение:

alpha_dict = {"A": ("Apple", 14.5), "B": ("Banana", 23.4)} 

user_input = "A" 

alpha_dict[user_input] 
Out[8]: ('Apple', 14.5) 

Применяя эти идеи к вашему фактическому прецеденту довольно просто, в вашей попытке вы итерацию данных и попытались чтобы найти спички в portfolio_list ключей, но это легче перебирать portfolio_list и искать совпадения в данных:

EXCHANGE_DATA = [('AIA', 'Auckair', 1.50), 
      ('AIR', 'Airnz', 5.60), 
      ('AMP', 'Amp',3.22), 
      ('ANZ', 'Anzbankgrp', 26.25), 
      ('ARG', 'Argosy', 12.22), 
      ('CEN', 'Contact', 11.22), 
      ('CNU', 'Chorus',3.01), 
      ('DIL', 'Diligent', 5.3), 
      ('DNZ', 'Dnz Property', 2.33), 
      ('EBO', 'Ebos', 1.1)] 

portfolio_str=input("Please list portfolio: ") 
portfolio_str= portfolio_str.replace(' ','') 
portfolio_str= portfolio_str.upper() 
portfolio_list= portfolio_str.split(',') 

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

Please list portfolio: AIA, ARG 

печати:

print('{:<6} {:<20} {:>8}'.format('Code', 'Name', 'Price')) 
Code Name     Price 

for code in portfolio_list: 
    # This assumes there will only be one record per code 
    rec = [rec for rec in EXCHANGE_DATA if rec[0] == code][0] 
    # The *rec part is using a neat python feature called 
    # tuple unpacking, google it if you're not familiar with it 
    print('{:<6} {:<20} {:>8.2f}'.format(*rec)) 

Выход:

AIA Auckair     1.50 
ARG Argosy     12.22 
+0

Что произойдет, если пользовательский ввод несколько значений? – jevans

+1

@jevans: Я не пробовал обращаться к нескольким значениям. Если вы не можете понять, как преобразовать входные данные типа «A, B» в отдельные значения, возможно, вы должны задать новый вопрос, так как для вопросов stackoverflow обычно лучше обращаться к одной вещи за раз. – Marius

+0

Я обновил свой код ... – jevans

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