2014-01-08 4 views
0

я имею в Dict в Словаре в питоне, для получения случайного значения из СловареКортеж из Dict в Словаре в Python

words = {0:{"wake up": "aaaa"}, 
     1:{"look after": "bbbb"}, 
     2:{"turn on": "cccc"} 
     } 

я хочу извлечь вторую Dict (значения клавиши) из в Dict слова

(k, v) = words[random.randint(0, 22)] 

но ошибка thisone

ValueError: need more than 1 value to unpack 

почему мне нужно еще ценности?

ответ

3

Вы получаете доступ к словарю с помощью ключа, который возвращает только значение:

value = words[random.randint(0, 22)] 

но если ваши ключи все целые числа, вы бы лучше использовать список вместо:

words = [{"wake up": "aaaa"}, {"look after": "bbbb"}, {"turn on": "cccc"}] 
value = random.choice(words) 

и пусть random.choice() делать всю тяжелую работу по сбору одного в случайном порядке.

Вы можете использовать random.choice() со значениями словаря тоже конечно:

value = random.choice(list(words.values())) 

будет возвращать случайное значение из словаря, а также:

key, value = random.choice(list(words.items())) 

возвратит случайный (key, value) пар для вас.

Если вы имели в виду, чтобы извлечь хранимую словарь в ключ и значение, вы должны были бы извлечь только один ключ-значение пары из этого объекта; Вы не можете использовать кортеж распаковке на словарем:

>>> key, value = {'foo': 'bar'} 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: need more than 1 value to unpack 

, но это работает:

>>> key, value = next(iter({'foo': 'bar'}.items())) 
>>> key, value 
('foo', 'bar') 

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

+0

Обратите внимание, что: 'random.choice (список (слов. values ​​())) 'является более длинным и, возможно, менее эффективным способом записи' random.choice (words) ' –

+0

@JonClements: Нет, это совсем не то же самое. Это возвращает случайный * ключ *. –

+0

@JonClements: Ах, здесь все целые числа; 'random.choice (dictionary)' ** обычно ** даже не работает. 'random.choice()' выбирает случайное целое число в диапазоне '[0, len (sequence))' и возвращает 'seq [selected_index]', что только по совпадению работает с этим словарем. –

0

Реферат: Метод 3 является самым путинским способом сделать это.

  1. без каких-либо изменений в структурах данных, следующий код будет работать для вас:

    k, v = words[random.randint(0, 2)].items()[0] 
    

    Однако, это не самый лучший (& вещий) способ сделать это.

  2. Если ваш внутренний dict всегда имеет одну пару с ключом, тогда нет необходимости хранить его как dict. Скорее, сохраните внутренние данные как кортеж.

    words = {0: ("wake up", "aaaa"), 
        1:("look after", "bbbb"), 
        2:("turn on", "cccc") 
    } 
    
    # Now, the following line should work fine 
    k, v = words[random.randint(0, 2)] 
    
  3. и если нет никаких ограничений на внешней структуре данных либо, а затем использовать список или кортеж следующим образом:

    words = (
        ("wake up", "aaaa"), 
        ("look after", "bbbb"), 
        ("turn on", "cccc") 
    ) 
    
    # Now, the random.choice can be used 
    k, v = random.choice(words) 
    
Смежные вопросы