Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

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

#python #python_3x #генерация_случайных_данных


Есть ли возможность перебрать рандомно ключи словаря без повторений? 

У меня есть словарь с английскими словами и их переводом на русский, т.е 1 ключ:
1 значение. Надо их каждый раз, при запуске программы выводить рандомно эти ключи,
но без повторения

Пробовал применить метод shuffle из random но вылезает ошибка


    


Ответы

Ответ 1



Пример: import random d = { 'one':'один', 'two':'два', 'three':'три', 'four':'четыре', 'five':'пять' } In [39]: random.sample(d.keys(), len(d)) Out[39]: ['one', 'four', 'three', 'two', 'five'] In [40]: random.sample(d.keys(), len(d)) Out[40]: ['five', 'three', 'one', 'four', 'two'] In [41]: random.sample(d.keys(), len(d)) Out[41]: ['one', 'three', 'two', 'four', 'five'] In [42]: random.sample(d.keys(), len(d)) Out[42]: ['two', 'one', 'five', 'four', 'three'] UPDATE: from collections import OrderedDict In [64]: OrderedDict([(k,d[k]) for k in random.sample(d.keys(), len(d))]) Out[64]: OrderedDict([('two', 'два'), ('one', 'один'), ('three', 'три'), ('five', 'пять'), ('four', 'четыре')]) In [65]: OrderedDict([(k,d[k]) for k in random.sample(d.keys(), len(d))]) Out[65]: OrderedDict([('five', 'пять'), ('three', 'три'), ('four', 'четыре'), ('one', 'один'), ('two', 'два')]) или: import random from collections import OrderedDict def shuffle_dict(d): keys = list(d.keys()) random.shuffle(keys) return OrderedDict([(k, d[k]) for k in keys]) Использование: In [89]: shuffle_dict(d) Out[89]: OrderedDict([('three', 'три'), ('four', 'четыре'), ('five', 'пять'), ('one', 'один'), ('two', 'два')]) In [90]: shuffle_dict(d) Out[90]: OrderedDict([('one', 'один'), ('three', 'три'), ('two', 'два'), ('five', 'пять'), ('four', 'четыре')]) In [91]: shuffle_dict(d) Out[91]: OrderedDict([('three', 'три'), ('four', 'четыре'), ('two', 'два'), ('one', 'один'), ('five', 'пять')])

Ответ 2



Словарь — это неупорядоченная структура данных в Питоне (до Python 3.7). Порядок обхода может поменяться даже внутри одного и того же процесса (для разных словарей или для одного и того же словаря при вставке/удалении ключей). С другой стороны, в зависимости от реализации и настроек порядок ключей может повторяться и между запусками программы (в CPython 3.6 реализации словарь вообще упорядоченным является). Можно отдельный список ключей использовать и вручную его перемешать, чтобы не полагаться на PYTHONHASHSEED и другие особенности реализации словарей: import random keys = list(your_dict) random.shuffle(keys) Если хотите использовать словарь, который гарантированно сохраняет порядок вставки ключей: from collections import OrderedDict your_dict = OrderedDict(zip(keys, map(your_dict.get, keys))) Просто для обхода ключей не нужно OrderedDict создавать.

Комментариев нет:

Отправить комментарий