Упрощенный словарь с использованием понятий

#python #dictionary-comprehension

Вопрос:

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

 import random  vowel = "aeiou" consonants = "bcdfghjklmnpqrstvwxyz" hand = {}  for i in range(numVowels):  x = VOWELS[random.randrange(0,len(VOWELS))]  hand[x] = hand.get(x, 0)   1   for i in range(numVowels, n):   x = CONSONANTS[random.randrange(0,len(CONSONANTS))]  hand[x] = hand.get(x, 0)   1  

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

1. Что должен делать код?

2. используйте random.choices для вычисления списка за один раз, а затем collections.Counter для создания диктанта. но на самом деле ответ заключается в том, что вы не можете сделать это с пониманием

Ответ №1:

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

for Цикл изменяет содержимое dict с каждой итерацией, в то время dict как понимание сначала создает целое dict , а затем присваивает его var.

Вот пример с пониманием списка:

 # for loop gt;gt;gt; l = [1] * 20 gt;gt;gt; for i in range(1, 20): ... l[i] = l[i - 1]   l[i] ... gt;gt;gt; l [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]  # list comprehension gt;gt;gt; l = [1] * 20 gt;gt;gt; l = [ l[i - 1]   l[1] for i in range(1, 20) ] gt;gt;gt; l [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2  

И понимание диктанта

 # for loop gt;gt;gt; s = "abcdefghij" gt;gt;gt; d = {} gt;gt;gt; for i in range(10): ... d[s[i]] = d.get(s[i - 1], 0)   1 ... gt;gt;gt; d {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10}   # dict comprehension gt;gt;gt; s = "abcdefghij" gt;gt;gt; d = {} gt;gt;gt; d = {s[i]: d.get(s[i - 1], 0)   1 for i in range(10)} gt;gt;gt; d {'a': 1, 'b': 1, 'c': 1, 'd': 1, 'e': 1, 'f': 1, 'g': 1, 'h': 1, 'i': 1, 'j': 1}