Как получить первые 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]:
Другие вопросы по тегам