2015-05-02 3 views
0

У меня есть словарь, который выглядит следующим образом:Для проходного только части словаря Python

[2, ["aaa", "bbb"]] 
[10, ["ccc", "ddd"]] 
[1, ["eee", "fff"]] 
[9, ["ggg", "hhh"]] 
[4, ["iii", "jjj"]] 
[8, ["kkk", "lll"]] 
... 

У меня есть цикл, который перебирает отсортированный (на основе ключей в порядке возрастания) словарь:

for i in sorted(dict): 
    print "%s %s" % (dict[i][0], dict[i][1]) 

И вывод должен быть:

eee fff 
aaa bbb 
iii jjj 
kkk lll 
ggg hhh 
ccc ddd 
... 

Однако цикл прямо сейчас петли через каждые си ngle element. Но если я хочу только пройти, например, первые 4, как мне это сделать? Выход будет:

eee fff 
aaa bbb 
iii jjj 
kkk lll 

Я знаю, что этот метод называется диапазон, но это, по-видимому, не работает:

for i in range(4) 
    print "%s %s" % (dict[i][0], dict[i][1]) 

Как это исправить?

+2

Инициализируйте счетчик перед циклом, увеличивайте его с каждой итерацией и 'break', когда он' 4'. – TigerhawkT3

+2

Незначительная коррекция: это не словарь python. Но вы наверняка уже знали это;) – gustafbstrom

+0

Причина, по которой ваша попытка не работает, заключается в том, что 'для i в отсортированном (dict)' итерации по каждой клавише, тогда как 'for i в диапазоне (4)' выполняет итерации по номерам от 0 до 4 (не включая 4). Похоже, что ваши словарные ключи не включают '0',' 1', '2' и' 3'. – TigerhawkT3

ответ

3

sorted() возвращает список ключей словаря, так что вы можете просто перебирать ломтиком первых четырех элементов:

for i in sorted(dict)[:4]: 
    print "%s %s" % (dict[i][0], dict[i][1]) 

Кроме того, в случае, если вы hadn Вы не должны использовать имя Python built-in function как имя переменной, иначе вы потеряете доступ к этой функции.

1
counter = 0 

for i in sorted(dict): 
    print "%s %s" % (dict[i][0], dict[i][1]) 
    counter += 1 
    if counter == 4: 
     break 

Кроме того, название вашего словаря нечто иное, чем dict так, что вы не маскировать встроенную функцию dict().

+0

Кто-нибудь хотел бы объяснить нисходящее движение, чтобы я мог улучшить этот ответ? – TigerhawkT3

+0

'counter + break' вовсе не Pythonic. См. Некоторые другие ответы. – tzaman

+0

Использование 'break' с счетчиком прост и понятен.Другие решения хороши, но я думаю, что это тоже хорошо. – TigerhawkT3

1

Попробуйте следующее:

for (n, i) in enumerate(sorted(dict)): 
    if n >= 4: break 
    print("%s %s" % (dict[i][0], dict[i][1])) 
1

Просто нарежьте его. Кроме того, выглядит путь чище, если вы используете items методы и неявное распаковку:

for _, (a, b) in sorted(d.iteritems())[:4]: 
    print a, b 
0

Вы можете использовать функцию range, как указано выше, но вы используете его неправильно:

>>> for i in range(0, 4): 
...  print ' '.join(sorted(x)[i][-1]) 
... 
eee fff 
aaa bbb 
iii jjj 
kkk lll 
>>> 
+0

Это ужасно, вы сортируете весь словарь каждый раз. – tzaman

1

Вот пример как вы можете исправить свой исходный код, используя xrange, который похож на диапазон, но использует ленивую оценку, чтобы свести к минимуму ее объем памяти.

>>> di_sorted_keys = sorted(di) 
>>> for i in xrange(4): 
...  a, b = di[di_sorted_keys[i]] 
...  print a, b 
... 
eee fff 
aaa bbb 
iii jjj 
kkk lll 

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

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