牛客网Python入门【09字典】

一、遍历字典

operators_dict={'<': 'less than','==': 'equal'}
print("Here is the original dict:")

for i in sorted(operators_dict):
    print("Operator {} means {}.".format(i,operators_dict[i]))

operators_dict[">"]="greater than"  #字典增加新元素
print()  #输出空行
print("The dict was changed to:")
for i in sorted(operators_dict):
    print("Operator {} means {}.".format(i,operators_dict[i]))

在 Python 中,当你使用 for i in sorted(operators_dict): 这样的循环时,i 是在每次迭代中从 sorted(operators_dict) 得到的当前元素的引用(在这种情况下,它是字典的键)因此输出时operators_dict[i] ,i不加引号。

此外,

#输出空行
print("")  #传入一个空字符串 
print(" ") #严格来说,它并不是完全意义上的“空行”。它实际上输出了一个空格字符,但是由于这个字符是不可见的,所以看起来像是一个空行。

并且本体中用到sorted()函数,此函数不会改变原本的字典,但如果使用dict.sort()编写,那么字典本身就是经过默认升序的新字典。

参考:sort与sorted的区别_sort和sorted函数的区别-优快云博客

二、毕业生就业调查

survey_list=['Niumei','Niu Ke Le','GURR','LOLO']
result_dict={'Niumei': 'Nowcoder','GURR': 'HUAWEI'}

for i in survey_list:
    if i in result_dict:
        print('Hi, {}! Thank you for participating in our graduation survey!'.format(i))
    else:
        print('Hi, {}! Could you take part in our graduation survey?'.format(i))

三、姓名与学号

my_dict_1={'name': 'Niuniu','Student ID': 1}
my_dict_2={'name': 'Niumei','Student ID': 2}
my_dict_3={'name': 'Niu Ke Le','Student ID': 3}

dict_list=[]
dict_list.append(my_dict_1)
dict_list.append(my_dict_2)
dict_list.append(my_dict_3)

for dict_item in dict_list:
    name=dict_item["name"]
    id=dict_item["Student ID"]
    print(f"{name}'s student id is {id}.")

这里要求把多个字典添加到dict_list列表中 ,使得dict_list[0]={'name': 'Niuniu', 'Student ID': 1},相当于列表中的一个元素是字典,那么需要从字典里拆解信息,这里的dict_item就是我们循环时的i,即表示第i个字典名,类似dict_list={'name': 'Niuniu', 'Student ID': 1},再通过字典查询并赋值,最后通过f-string输出,这样的输出方式比format要好一些。

四、首都

cities_dict = {
    'Beijing': {'Capital': 'China'},
    'Moscow': {'Capital': 'Russia'},
    'Paris': {'Capital': 'France'}   #这里的Capital为字符型,应加引号
}
for city, country in sorted(cities_dict.items()):
    print(f'{city} is the capital of {country["Capital"]}!')

 调用 cities_dict.items() 会返回一个迭代器,该迭代器会生成以下元组:

(('Beijing', {'Capital': 'China'}),  
 ('Moscow', {'Capital': 'Russia'}),  
 ('Paris', {'Capital': 'France'}))

然后在进行排序(按照字母序(A-Z)排列) 

如果直接使用sorted(cities_dict)进行排序,那么默认情况下它会返回字典键的排序列表,因为字典在迭代时会默认只提供键,即排序好的['Beijing', 'Moscow', 'Paris'],而失去了关于'Capital'的信息,而这些信息是题目要求的。

对于for循环输出:

for city, country in sorted(cities_dict.items()):
    print(f'{city} is the capital of {country["Capital"]}!')

在这里,sorted(cities_dict.items()) 会返回一个已按城市名排序的元组列表,然后for循环会遍历这个列表,并将每个元组的第一个元素赋值给 city 变量,第二个元素赋值给 country 变量,这里的country={'Capital': 'China'},因此在输出时用country['Captital']来得到China。

或者还有一种方法

cities_dict = {'Beijing': {'Capital': 'China'},'Moscow': {'Capital': 'Russia'},'Paris': {'Capital': 'France'}}
for i in sorted(cities_dict):
    print('%s is the capital of %s!'%(i,cities_dict[i]['Capital']))

在这里,使用sorted(cities_dict)会将字典中的键值升序排列,即,返回['Beijing', 'Moscow', 'Paris'],评论区有人写sorted(cities_dict.keys()),这两得到的效果是相同的,都是不包含键对应的值的。

但作者很聪明的,以i为变量,用cities_dict[i]['Capital']得到i对应的国家,因为cities_dict[i]={'Capital': 'China'},再往后面加上一个['Capital'],就变成了查询{'Capital': 'China'}字典的做法,这是非常巧妙的,两种方法各有好处,原理上都是一样的,country=cities_dict[i]。

五、喜欢的颜色

result_dict={'Allen': ['red','blue','yellow'],'Tom': ['green','white','blue'],'Andy': ['black','pink']}

for name,color in sorted(result_dict.items()):
    print(f"{name}'s favorite colors are:")
    for i in color:
        print(i)

或者这样

for i in sorted(result_dict):
    print(f"{i}'s favorite colors are:")
    for j in result_dict[i]:
        print(j)

 六、生成字典

name=input().split()
langu=input().split()
dict1=zip(name,langu)
print(dict(dict1))

这是标准答案,zip 函数是可以接收多个可迭代对象,然后把每个可迭代对象中的第i个元素组合在一起,形成一个新的迭代器,类型为元组。 但zip函数返回一个元组的迭代器,所以要么将其转化为别的类型,如dict()或list()等,否则想输出元素,需要使用多个next(dict1)。

PS:三个及以上的元素也可以使用zip函数组合在一起

参考:Python内置函数zip()函数详解_zip函数-优快云博客

以下为自己的想法:

str1=input().split()
str2=input().split()

my_dict={}
for i in range(len(str1)):
    my_dict[str1[i]]=str2[i]
print(my_dict)

在进行类型转换时可以使用如my_list=[(int)i for i in str],但输出时貌似不行。

七、查字典

my_dict={'a':['apple','abandon','ant'],'b':['banana','bee','become'],'c':['cat','come'],'d':'down'}

str=input()
if str in my_dict:
    for i in my_dict[str]:
        print(i,end=' ')
else:
    print("error!")

这里主要是不仅要查到字典中a对应的列表['apple', 'abandon', 'ant'],输出时还要以空格隔开逐个输出,类似于,apple abandon ant。

存在问题,输入d,输出d o w n,这是因为d所对应的字典不是列表,这样就把单词拆分了。

比较好的解决办法:

d = {'a': ['apple', 'abandon', 'ant'], 
        'b': ['banana', 'bee', 'become'], 
        'c': ['cat', 'come'], 
        'd': 'down'}

word = input()

if isinstance(d[word],list):  #先判断是不是列表,如果是就遍历列表
    for i in d[word]:
        print(i,end=' ')
else:                    #不是的话直接输出
    print(d[word])

八、字典新增

my_dict={'a': ['apple', 'abandon', 'ant'], 'b': ['banana', 'bee', 'become'], 'c': ['cat', 'come'], 'd': 'down'}

key=input()
value=input()

my_dict[key]=value
print(my_dict)

题目设置有问题,d对应的不是列表,导致输出时将单词down输出为d o w n。 

PS:1.要注意变量的命名,最好让人看到就知道是干什么的,比如字典中的key和value。

     ·2.word = input(">>")在输入时将会看到一个提示符(>>),然后可以输入任何想要的内容,这样写对用户友好。

评论区有一个在题目之外还完善了的答案 ,我们在写代码是就应该考虑这么多,比如你想新增的key是否已存在于字典中,如果不存在,则添加,如果存在,那么再判断输入的单词是否在列表中已存在,如果不存在,则添加。

#改变了一下
#直接输入单词,首字母为键,单词为值
#判断是否重复
word_dict = {
    'a': ['apple', 'abandon', 'ant'],
    'b': ['banana', 'bee', 'become'],
    'c': ['cat', 'come'],
    'd': 'down'
}
word = input(">>")
#判断首字母是否存在字典键中
if word[0] in word_dict.keys():
    #判断单词是否在对应键的值中
    if word in word_dict[word[0]]:
        print("exist!")
    else:
        word_dict[word[0]].append(word)
        print(word_dict)
else:
    word_dict[word[0]] = word
    print(word_dict)

但还是由于题目设置的问题,d对应的不是列表,这就导致添加时仍然会失败。

总的来说,我认为本题使大多数人出现问题,主要是题目的原因。字典中所有的value类型应该统一,但在本题中,仅仅因为目前d对应的value值只有一个,就没有设置它为列表类型,但这对于之后的字典的增删改查都是不方便的。

或者本题就是为了考验观察能力,那么,这也能说的过去(但提交答案时,并没有因为d的问题而判错)

无论如何,最正确的答案:(对于d的特殊情况,再加一个if语句,将其转换为list类型)

if letter in dic1:
    if letter == 'd': #如果为d,需要转换成列表
        list(dic1[letter]).append(word)
    dic1[letter].append(word)
else:
    #还不存在,需要将新数据变成list,就list(word)
    dic1[letter]=word

九、使用字典计数

my_dict={}
str_input=input()
for i in str_input:
    count = str_input.count(i)
    my_dict[i]=count
    
print(my_dict)

使用python的内置函数count()方法计算输入单词中每个字母出现的次数。 

 或者:不使用函数

a = input()
a_dict = {}   
for i in a:
   if i in a_dict: 
      a_dict[i]+=1
   else:
      a_dict[i]=1
print(a_dict)

或者:使用zip()函数或get函数

count_dict = {}
word = input()
for i in word:
    count_dict[i] = count_dict.get(i,0) + 1
print(count_dict)

get()函数用于获取指定键对应的值,如果i在字典中不存在,那么返回设置的0,再加1,即,若果之前不存在,就设为1,如果存在,get函数会返回上一次保存的次数,再加一。这个方法和上一个方法的原理差不多。

zip()函数可以将多个可迭代对象中对应的元素打包成一个元组,然后返回这些元组组成的迭代器。

a = input()
b = []
c = []
for i in a:
    j=a.count(i)
    b.append(i)
    c.append(j)
print(dict(zip(b,c)))

 这个方法用一个空列表存储key,另一个存储次数。在循环结束之后,使用zip()函数打包,再转化为字典类型。

在这里有一个小发现,在Python中,字典的键必须是唯一的,如果你尝试使用相同的键来添加新的值,新的值会覆盖旧的值。这意味着如果你尝试将两组同样的键和值添加到字典中,后面的键值对会覆盖前面的键值对。

即,在上述代码中,如果我输入“hello”,得到的两组值

但在使用dict(zip(b,c)转换为字典类型后,只有一组:('l',2),这正是由于字典的特性得到的,

如果不转换为字典,而是list(zip(b,c),那么输出为

所以在循环中,无需担心多次遍历造成结果错误。

总体来说,解决本题还是count()方法好用,在编程时,可以多找找相应的函数,可以省很多事。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值