2013-07-13 5 views
1

я выполнил этот фрагмент:Logic со словарем и списком

lloyd = { 
    "name": "Lloyd", 
    "homework": [90.0, 97.0, 75.0, 92.0], 
    "quizzes": [ 88.0, 40.0, 94.0], 
    "tests": [75.0, 90.0] 
} 
alice = { 
    "name": "Alice", 
    "homework": [100.0, 92.0, 98.0, 100.0], 
    "quizzes": [82.0, 83.0, 91.0], 
    "tests": [89.0, 97.0] 
} 
tyler = { 
    "name": "Tyler", 
    "homework": [0.0, 87.0, 75.0, 22.0], 
    "quizzes": [0.0, 75.0, 78.0], 
    "tests": [100.0, 100.0] 
} 

students=[lloyd, alice, tyler] 

for i in students: 
    for f in i: 
     print i[f] 

Я не понимаю, почему выход следующий:

[88.0, 40.0, 94.0] 
[75.0, 90.0] 
Lloyd 
[90.0, 97.0, 75.0, 92.0] 
[82.0, 83.0, 91.0] 
[89.0, 97.0] 
Alice 
[100.0, 92.0, 98.0, 100.0] 
[0.0, 75.0, 78.0] 
[100.0, 100.0] 
Tyler 
[0.0, 87.0, 75.0, 22.0] 

Почему это происходит так? Где я могу найти документы для этого? Может ли кто-нибудь дать мне краткое объяснение логики вывода?

+1

Словари не упорядочены. – flup

+1

словари неупорядочены. что ты хочешь? –

ответ

6

Обычные словари не упорядочены.

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

Source

Если вам действительно нужен упорядоченный словарь, смотреть в OrderedDict.

6

Словарь-ключи не имеют определенного порядка. {'a':1,'b':2} и {'b':2,'a':1} считаются равными, и они выдают один и тот же путь:

>>> {'a':1, 'b':2} 
{'a': 1, 'b': 2} 
>>> {'b':2, 'a':1} 
{'a': 1, 'b': 2} 

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

1

Вы можете легко исправить это с измененным контуром:

for student in students: 
    for key in ["name", "homework", "quizzes", "tests"]: 
     print student[key] 

Namedtuples может быть лучше подходит здесь:

from collections import namedtuple 
Student = namedtuple('Student', ["name", "homework", "quizzes", "tests"]) 

students = [ 
    Student(name="Lloyd", 
      homework=[90.0, 97.0, 75.0, 92.0], 
      quizzes=[ 88.0, 40.0, 94.0], 
      tests=[75.0, 90.0]) 
    Student(name="Alice", 
      homework=[100.0, 92.0, 98.0, 100.0], 
      quizzes=[82.0, 83.0, 91.0], 
      tests=[89.0, 97.0]) 
    Student(name="Tyler", 
      homework=[0.0, 87.0, 75.0, 22.0], 
      quizzes=[0.0, 75.0, 78.0], 
      tests=[100.0, 100.0]) 
] 
+0

У меня возникнет соблазн рассмотреть 'get_vals = operator.itemgetter ('name', 'homework', 'quizzes', 'tests')' then 'для студентов в учебе: print get_vals (student)' –

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