forked from bslatkin/effectivepython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathitem_16.py
More file actions
executable file
·244 lines (179 loc) · 5.82 KB
/
item_16.py
File metadata and controls
executable file
·244 lines (179 loc) · 5.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
#!/usr/bin/env PYTHONHASHSEED=1234 python3
# Copyright 2014-2019 Brett Slatkin, Pearson Education Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Reproduce book environment
import random
random.seed(1234)
import logging
from pprint import pprint
from sys import stdout as STDOUT
# Write all output to a temporary directory
import atexit
import gc
import io
import os
import tempfile
TEST_DIR = tempfile.TemporaryDirectory()
atexit.register(TEST_DIR.cleanup)
# Make sure Windows processes exit cleanly
OLD_CWD = os.getcwd()
atexit.register(lambda: os.chdir(OLD_CWD))
os.chdir(TEST_DIR.name)
def close_open_files():
everything = gc.get_objects()
for obj in everything:
if isinstance(obj, io.IOBase):
obj.close()
atexit.register(close_open_files)
# Example 1
counters = {
"pumpernickel": 2,
"sourdough": 1,
}
# Example 2
key = "wheat"
# if key in counters then then update dist else add
# key with value 1
if key in counters:
count = counters[key]#set count to last value in dict
else: #if new then value to 1
count = 0
counters[key] = count + 1
# counters[key]
print(counters["pumpernickel"])
print(counters)
# Example 3
key = "brioche"
# use of try if not in set then raise keyerror
# set count = 0 and add new key with value 1 to set
try:
count = counters[key]#if in dict then true and last value + 1
except KeyError:#if new raise error value = 1
count = 0
counters[key] = count + 1
print(counters)
# Example 4
key = "multigrain"
# (get method)Return the value for key if
# key is in the dictionary, else default = 0
# assign if key exits else assign 0 then add key,value to set
count = counters.get(key, 0)#assign last value from dict else default 0
counters[key] = count + 1# add 1 to value or assign 1 to new
print(counters)
# Example 5
key = "baguette"
# test key not in set then add key with 0 value
# then update key with 1
if key not in counters:#assign 0 with if to new value 0
counters[key] = 0#palced in dict with value 0
counters[key] += 1 # add 1 to key/value pair
print(counters)
key = "ciabatta"
# update key with 1 if already in set
# add new key wit value 1
if key in counters:#if in dict +1 else new =1
counters[key] += 1
else:
counters[key] = 1
print(counters)
key = "ciabattan"
# try key in set update with 1
# keyerror add new key with value 1
try:
counters[key] += 1#if in dict +1
except KeyError: #not in dict =1
counters[key] = 1
print(counters)
# Example 6
votes = {#dict with key/list pairs as build by structure
"baguette": ["Bob", "Alice"],
"ciabatta": ["Coco", "Deb"],
}
print(votes)
key = "brioche"
who = "Elmer"
if key in votes:#if key true set value to var
names = votes[key]
else:
# connect the key in votes to his list which is called names
# actually a dict where names is alist connect to key
votes[key] = names = [] #set item to dict and assign empty list(indirect through var)
print(votes)#with empty list for new key
print(votes[key]) #new key has empty list
print(key)# returns new key
print(names)#returns new value
# append "Elmer" to reference names of "Brioche" is a list
names.append(who) #assign value to empty list named names connected with new dict item
print(names)
print(votes)
# Example 7
key = "rye"
who = "Felix"
try:
# check "rye" in votes if not make reference and []
names = votes[key]#if true set dict element to names list
except KeyError:#if new key then set dict element to key/names = [] pair
votes[key] = names = []
# then append "Felix" to "rye" or [] referenced by names to "rye"
names.append(who)#assign value to new key/names = [] list or existing key/list pair
print(votes)
# Example 8
key = "wheat"
who = "Gertrude"
# assign list to names if not then assign None is default for get method
names = votes.get(key)#if key exists then else None
print(names)
# test names on None (default return from get method)
if names is None:#test for None -> new value
votes[key] = names = [] #assign empty list to new key/names pair
names.append(who)#assign value to key/list pair
print(votes)
# Example 9
key = "brioche"
who = "Hugh"
# assign key to names in if statement and test on None
# default for get method if not assign []
if (names := votes.get(key)) is None:#assign and test for new in one go
votes[key] = names = [] #assign [] to new key/list pair
# assign value to key in key/value pair
names.append(who)#general assign key/list pair
print(votes)
# Example 10
key = "cornbread"
who = "Kirk"
# assign list with key to names if not default to []
names = votes.setdefault(key, [])#test for key set existing value to list if new key default to [] list
# assign value to list, in key/list pair
print(votes)#key/list ->empty for new key/list pair
names.append(who)#assign value to key/list pair
print(votes)
# Example 11
data = {}
key = "foo"
value = []
# assign a list(object) to a key or default value/list
data.setdefault(key, value)#create dict with key/list pair
print("Before:", data)
value.append("hello")#add to key/list pair
print("After: ", data)
# Example 12
key = "dutch crunch"
# can also assign default value to key in key,value pair
print(counters)
count = counters.setdefault(key, 0)#set var count to value or default to 0 and assigns new key/value =0 pair to dict
print(counters)
print(count)
# add value to key,value pair
counters[key] = count + 1 #general add 1 to key/value pair
print(counters)