#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}