Как получить первые N элементов из словаря по умолчанию в Python 3x
Я ищу питонический способ получения первого N элемента из DefaultDict. Я искал это на нескольких форумах. Не удалось найти полезного решения. Я попробовал следующее, но это не останавливает выполнение, как ожидалось.
Код:
d_2 = defaultdict(list)
i = -1
for x,y in sorted(d_2.items(), reverse = True):
i = i + 1
if i <= 20:
print ("%d, %s" %(i,x))
most_used_val_bar.add(str(x),y)
else:
break
most_used_val_bar.render_to_file(directory + "/most_used_values.svg")
Но этот код не ломается, когда мне за 20, я использую этот цикл для построения графиков с помощью Pygal Plotting Library
2 ответа
Если вы действительно ищете первые 20 предметов в defaultdict
это бессмысленно; предметы в defaultdict
как с нормальным dict
в произвольном порядке, поэтому "первых" нет.
Но из вашего кода я подозреваю, что вы можете искать первые 20 элементов в итераторе, которые вы получили при сортировке элементов dict. В этом случае ответ прост. Неважно, что значения изначально пришли из defaultdict
; у вас есть итерация, вы хотите разделить его на первые 20 пунктов, вы звоните islice
:
for x, y in itertools.islice(sorted(d_2.items(), reverse=True), 20):
При этом, возможно, будет более понятным (и будет более эффективным с точки зрения пространства) просто создать список из первых 20 мест в первую очередь, вместо создания отсортированного списка, а затем взять первые 20:
for x, y in heapq.nsmallest(20, d_2.items()):
Итерируйте по фрагменту первых 20 элементов вашего отсортированного списка элементов словаря:
for x,y in sorted(d_2.items(), reverse = True)[:20]: