Поиск по списку списков и отображение результатов

58
5

У меня есть список списков, который выглядит так:

[['De Aza, Alejandro', 'CWS', '153', '607', '84', '160', '27', '4', '17'],
['Hunter, Torii', 'DET', '144', '606', '90', '184', '37', '5', '17'],
['Hamilton, Josh', 'LAA', '151', '576', '73', '144', '32', '5', '21'],
['Choo, Shin-Soo', 'CIN', '154', '569', '107', '162', '34', '2', '21'],
['Upton, Justin', 'ATL', '149', '558', '94', '147', '27', '2', '27'],
['Cabrera, Miguel', 'DET', '148', '555', '103', '193', '26', '1', '44'],
['Posey, Buster', 'SF', '148', '520', '61', '153', '34', '1', '15'],
['Suzuki, Ichiro', 'NYY', '150', '520', '57', '136', '15', '3', '7'],
['Holliday, Matt', 'STL', '141', '520', '103', '156', '31', '1', '22'],
['Headley, Chase', 'SD', '141', '520', '59', '130', '35', '2', '13'],
['Cabrera, Asdrubal', 'CLE', '136', '508', '66', '123', '35', '2', '14'],
['Pierzynski, A.J.', 'TEX', '134', '503', '48', '137', '24', '1', '17'],
['Hoes, L.J.', 'HOU', '46', '167', '24', '48', '7', '2', '1'],
['Young Jr., Eric', 'COL', '57', '165', '22', '40', '9', '3', '1'],
['Hairston, Scott', 'CHC', '52', '99', '13', '17', '2', '0', '8'],
['Arnaud, Travis', 'NYM', '31', '99', '4', '20', '3', '0', '1'],
['Ankiel, Rick', 'NYM', '20', '66', '7', '12', '4', '1', '2'],
['Ankiel, Rick', 'HOU', '25', '62', '6', '12', '3', '0', '5'],
['den Dekker, Matt', 'NYM', '27', '58', '7', '12', '1', '0', '1'],
['Sanchez, Angel', 'CWS', '1', '2', '0', '0', '0', '0', '0']]

И я хочу, чтобы пользователь вводил команду типа "TEAM DET" и список всех списков, в которых был создан этот командный элемент, поэтому "TEAM DET" будет иметь что-то вроде:

Name          | Team | Games played | at bats | runs scored | hits | doubles | triples | homeruns |
Hunter, Torii | DET | 144 | 606 | 90 | 184 | 37 | 5 | 17 |

И так далее со всеми членами DET

EDIT: я использую python 3.3.3

спросил(а) 2014-03-18T05:19:00+04:00 6 лет, 7 месяцев назад
1
Решение
71

Используйте defaultdict для упрощения поиска. Создайте словарь, где имя команды - это ключ, и все записи, которые имеют эту команду, являются значениями. Значения будут списком. Следовательно, defaultdict(list) был бы уместным.

from collections import defaultdict
from pprint import pprint

data_dict = defaultdict(list)
for item in data:
data_dict[item[1]].append(item)
pprint(data_dict['DET'])

И это будет то, что вы получите:

[['Hunter, Torii', 'DET', '144', '606', '90', '184', '37', '5', '17'],
['Cabrera, Miguel', 'DET', '148', '555', '103', '193', '26', '1', '44']]

Затем вы можете использовать модуль csv для форматирования и отображения вывода так, как вам нужно. Надеюсь, поможет.

ответил(а) 2014-03-18T06:00:00+04:00 6 лет, 7 месяцев назад
42

Вот компактная примерная программа, которая полностью заполняет ваше требование:

l=[['De Aza, Alejandro', 'CWS', '153', '607', '84', '160', '27', '4', '17'],
['Hunter, Torii', 'DET', '144', '606', '90', '184', '37', '5', '17'],
['Hamilton, Josh', 'LAA', '151', '576', '73', '144', '32', '5', '21'],
['Choo, Shin-Soo', 'CIN', '154', '569', '107', '162', '34', '2', '21'],
['Upton, Justin', 'ATL', '149', '558', '94', '147', '27', '2', '27'],
['Cabrera, Miguel', 'DET', '148', '555', '103', '193', '26', '1', '44']]
header="|Name | Team | Games played | at bats | runs scored | hits | doubles | triples | homeruns |"
formatstring="".join(["|%-"+str(columnwidth)+"s" for columnwidth in [len(i) for i in header.split("|")[1:-1]]])+"|"
command=raw_input("Enter a command!\n")
cmdparts=command.split()
if cmdparts[0]=="TEAM" and len(cmdparts)>=2:
print header
for team in cmdparts[1:]:
for item in l:
if team in item[1]:
print formatstring % tuple(item)

Когда он называется, он запрашивает команду. Если вы наберете TEAM DET LAA, он перечислит все записи из команд DET и LAA в таблице:

$ python test.py
Enter a command!
TEAM DET LAA
|Name | Team | Games played | at bats | runs scored | hits | doubles | triples | homeruns |
|Hunter, Torii |DET |144 |606 |90 |184 |37 |5 |17 |
|Cabrera, Miguel |DET |148 |555 |103 |193 |26 |1 |44 |
|Hamilton, Josh |LAA |151 |576 |73 |144 |32 |5 |21 |

ответил(а) 2014-03-18T06:07:00+04:00 6 лет, 7 месяцев назад
42

Вместо использования кортежей, используйте список словарей.

Пример:

players = []
player = {'Player': 'Hunter, Torii', 'Team': 'DET', 'Games Played': '144', 'At Bats': '606', 'Runs Scored': '90', 'Hits': '184', 'Doubles': '37', 'Triples': '5', 'Homeruns': '17']
players.append(player)
#Put each player in that format and append to the list

input = input()

for player in players:
if player['Team'] == input:
print(player)

Очевидно, вы отформатируете выражение печати так, как хотите. Если у вас есть вопросы, просто спросите ниже.

ответил(а) 2014-03-18T05:30:00+04:00 6 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема