2012-03-27 3 views
2

Так что у меня этот код:Двумерный список в Python?

Team1 = ["Red", 10] 
Team2 = ["Green", 5] 
Team3 = ["Blue", 6] 
Team4 = ["Yellow", 8] 
Team5 = ["Purple", 9] 
Team6 = ["Brown", 4] 

TeamList = [Team1, Team2, Team3, Team4, Team5, Team6] 

Я хочу сделать двумерный список различий в оценках между каждой парой команд. Выходной сигнал может быть таким: Output

Что является самым простым способом для этого? Спасибо :)

+0

два для петель ... –

+0

Вы знаете о 'dict'? – wim

+5

Это было бы неплохое домашнее задание –

ответ

4

Просто с помощью вкладок, а не какой-либо фантазии форматирования для построения графика:

Team1 = ["Red", 10] 
Team2 = ["Green", 5] 
Team3 = ["Blue", 6] 
Team4 = ["Yellow", 8] 
Team5 = ["Purple", 9] 
Team6 = ["Brown", 4] 

TeamList = [Team1, Team2, Team3, Team4, Team5, Team6] 

# print the top row of team names, tab separated, starting two tabs over: 
print '\t\t', '\t'.join(team[0] for team in TeamList) 

# for each row in the chart 
for team in TeamList: 
    # put two tabs between each score difference column 
    scoreline = '\t\t'.join(str(team[1] - other[1]) for other in TeamList) 
    # and print the team name, a tab, then the score columns 
    print team[0], '\t', scoreline 
+0

Альтернативно, форматирование строк с использованием полей фиксированной ширины для текста. (Хонк, если вы любите 'sprintf()'.) –

6

Вы можете попробовать:

[[x[1]-y[1] for y in TeamList] for x in TeamList] 

Это создаст вложенный список, представляющий предлагаемый выход (без заголовков столбцов и строк, конечно).

+1

OP кажется новым для Python, поэтому я бы представил «более простую» версию 'for' до этого –

+1

@Kshitij Этот способ объективно проще. Только из-за вашего знакомства с другими языками программирования, которые вы считаете иначе. –

+0

@ KarlKnechtel, но он также вводит определения лямбда с неестественными областями. В то время как большинство опытных программистов на питоне любят однострочники, подобные этому (включая меня), я считаю, что это может запутать новичков на этом языке. Конечно, это только мое мнение. –

3

Вы можете попробовать вложенный цикл. Что-то вроде этого: -

for team1 in TeamList: 
    for team2 in TeamList: 
     print team1[1]-team2[1] 

Это даст оценку. Выход должен быть отформатирован, чтобы получить точный вид таблицы, который вы хотите.

3

Пояснение в списке будет работать (но вложенные списки не подходят ко мне.) itertools.product() - это еще один способ.

Рассмотрим следующий пример в качестве пищи для размышлений:

import itertools 

scores = { 
"Red" : 10, 
"Green" : 5, 
"Blue" : 6, 
"Yellow": 8, 
"Purple": 9, 
"Brown" : 4, 
} 

for team_1, team_2 in itertools.product(scores, scores): 
    print ("Team 1 [%s] scored %i, Team 2 [%s] scored %i." % (team_1, scores[team_1], team_2, scores[team_2])) 

который выводит:

Team 1 [Blue] scored 6, Team 2 [Blue] scored 6. 
Team 1 [Blue] scored 6, Team 2 [Brown] scored 4. 
... (32 more lines) ... 
Team 1 [Red] scored 10, Team 2 [Green] scored 5. 
Team 1 [Red] scored 10, Team 2 [Red] scored 10. 
0
Team1 = ["Red", 10] 
Team2 = ["Green", 5] 
Team3 = ["Blue", 6] 
Team4 = ["Yellow", 8] 
Team5 = ["Purple", 9] 
Team6 = ["Brown", 4] 

TeamList = [Team1, Team2, Team3, Team4, Team5, Team6] 

# calculate scores 
scores = [[x[1]-y[1] for y in TeamList] for x in TeamList] 

# print the top row of team names, tab separated, starting two tabs over: 
print('\t\t', '\t'.join(team[0] for team in TeamList)) 

# for each row in the chart 
for score, team in zip(scores,TeamList): 
    print(("%s"+"\t%s"*len(TeamList)) % ((team[0],)+tuple(score))) 
Смежные вопросы