Python 如何创建值为集合的词典?
我正在做一个练习,需要我建立两个字典,其中一个是国家名称,值是GDP。这部分很好用 第二本字典是我丢失的地方,因为键应该是字母A-Z,值是国家名称集。我尝试使用for循环,我在下面对其进行了评论,这就是问题所在 如果用户输入的字符串只有一个字母,如a,则程序应打印以该字母开头的所有国家/地区。但是,当您运行该程序时,它只为每个字母打印出一个国家 文本文件包含228行。即:Python 如何创建值为集合的词典?,python,Python,我正在做一个练习,需要我建立两个字典,其中一个是国家名称,值是GDP。这部分很好用 第二本字典是我丢失的地方,因为键应该是字母A-Z,值是国家名称集。我尝试使用for循环,我在下面对其进行了评论,这就是问题所在 如果用户输入的字符串只有一个字母,如a,则程序应打印以该字母开头的所有国家/地区。但是,当您运行该程序时,它只为每个字母打印出一个国家 文本文件包含228行。即: 1:Qatar:98900 2:Liechtenstein:89400 3:Luxembourg:80600 4:Be
1:Qatar:98900
2:Liechtenstein:89400
3:Luxembourg:80600
4:Bermuda:69900
5:Singapore:59700
6:Jersey:57000
etc.
这是我的密码
initials = []
countries=[]
incomes=[]
dictionary={}
dictionary_2={}
keywordFile = open("raw.txt", "r")
for line in keywordFile:
line = line.upper()
line = line.strip("\n")
line = line.split(":")
initials.append(line[1][0]) # first letter of second element
countries.append(line[1])
incomes.append(line[2])
for i in range(0,len(countries)):
dictionary[countries[i]] = incomes[i]
这个for循环应该为每个国家/地区输出248个值,其中键是首字母,值是国家/地区名称。然而,对于字母表中的每个字母,它在一个国家只能给出26个值
for i in range(0,len(countries)):
dictionary_2[initials[i]] = countries[i]
print(dictionary_2)
while True:
inputS = str(input('Enter an initial or a country name.'))
if inputS in dictionary:
value = dictionary.get(inputS, "")
print("The per capita income of {} is {}.".format((inputS.title()), value ))
elif inputS in dictionary_2:
value = dictionary_2.get(inputS)
print("The countries that begin with the letter {} are: {}.".format(inputS, (value.title())))
elif inputS.lower() in "quit":
break
else:
print("Does not exit.")
print("End of session.")
如果有人能给我提供正确的方向,我将不胜感激
Python dict对象中的键是唯一的。一个dict只能有一个“L”键。在代码中发生的事情是,首先将键/值对“L”:“列支敦士登”插入到dictionary_2中。但是,在for循环的后续迭代中,“L”:“列支敦士登”被“L”:卢森堡覆盖。这种覆盖有时被称为重击
修理
获得您似乎想要的结果的一种方法是重写for循环:
此外,您还必须重写下面的相关elif语句:
elif inputS in dictionary_2:
titles = ', '.join([v.title() for v in dictionary_2[inputS]])
print("The countries that begin with the letter {} are: {}.".format(inputS, titles))
解释
下面是对上面的dictionary_2[initials[i]=dictionary_2.getinitials[i],set{countries[i]}行的完整解释:
字典2.getinitials[i],集合
如果缩写[i]是字典_2中的一个键,则返回相关值。如果缩写[i]不在字典中,它将返回空集。
{国家[i]}
这将创建一个新集合,其中包含一个成员国[i]。
字典2.getinitials[i],集合{countries[i]}
|运算符将两个集合的所有成员相加并返回结果。
字典2[首字母[i]]=。。。
线的右侧可以创建新集,也可以添加到现有集。这段代码将新创建/扩展的集合分配回dictionary_2。
笔记
上面的代码将dictionary_2的值设置为set。如果要使用列表值,请改用此版本的for循环:
for i in range(0,len(countries)):
dictionary_2[initials[i]] = dictionary_2.get(initials[i], []) + [countries[i]]
print(dictionary_2)
Python dict对象中的键是唯一的。一个dict只能有一个“L”键。在代码中发生的事情是,首先将键/值对“L”:“列支敦士登”插入到dictionary_2中。但是,在for循环的后续迭代中,“L”:“列支敦士登”被“L”:卢森堡覆盖。这种覆盖有时被称为重击
修理
获得您似乎想要的结果的一种方法是重写for循环:
此外,您还必须重写下面的相关elif语句:
elif inputS in dictionary_2:
titles = ', '.join([v.title() for v in dictionary_2[inputS]])
print("The countries that begin with the letter {} are: {}.".format(inputS, titles))
解释
下面是对上面的dictionary_2[initials[i]=dictionary_2.getinitials[i],set{countries[i]}行的完整解释:
字典2.getinitials[i],集合
如果缩写[i]是字典_2中的一个键,则返回相关值。如果缩写[i]不在字典中,它将返回空集。
{国家[i]}
这将创建一个新集合,其中包含一个成员国[i]。
字典2.getinitials[i],集合{countries[i]}
|运算符将两个集合的所有成员相加并返回结果。
字典2[首字母[i]]=。。。
线的右侧可以创建新集,也可以添加到现有集。这段代码将新创建/扩展的集合分配回dictionary_2。
笔记
上面的代码将dictionary_2的值设置为set。如果要使用列表值,请改用此版本的for循环:
for i in range(0,len(countries)):
dictionary_2[initials[i]] = dictionary_2.get(initials[i], []) + [countries[i]]
print(dictionary_2)
使用defaultdict确保初始值dict的每个值都是一个集合,然后使用add方法。如果您只是使用=每次都将覆盖初始键值,则defaultdict是使用以下表达式的更简单方法:
if initial in dict:
dict[initial].add(country)
else:
dict[initial] = {country}
请参阅下面的完整工作示例,并注意我使用的是enumerate而不是range0,lencountries,我还建议:
#!/usr/bin/env python3
from collections import defaultdict
initials, countries, incomes = [],[],[]
dict1 = {}
dict2 = defaultdict(set)
keywordFile = """
1:Qatar:98900
2:Liechtenstein:89400
3:Luxembourg:80600
4:Bermuda:69900
5:Singapore:59700
6:Jersey:57000
""".split("\n\n")
for line in keywordFile:
line = line.upper().strip("\n").split(":")
initials.append(line[1][0])
countries.append(line[1])
incomes.append(line[2])
for i,country in enumerate(countries):
dict1[country] = incomes[i]
dict2[initials[i]].add(country)
print(dict2["L"])
结果:
{'LUXEMBOURG', 'LIECHTENSTEIN'}
请参阅:使用defaultdict确保您的姓名首字母dict的每个值都是一个集合,然后使用add方法。如果您只是使用=每次都将覆盖初始键值,则defaultdict是使用以下表达式的更简单方法:
if initial in dict:
dict[initial].add(country)
else:
dict[initial] = {country}
请参阅下面的完整工作示例,并注意我使用的是enumerate而不是range0,lencountries,我还建议:
#!/usr/bin/env python3
from collections import defaultdict
initials, countries, incomes = [],[],[]
dict1 = {}
dict2 = defaultdict(set)
keywordFile = """
1:Qatar:98900
2:Liechtenstein:89400
3:Luxembourg:80600
4:Bermuda:69900
5:Singapore:59700
6:Jersey:57000
""".split("\n\n")
for line in keywordFile:
line = line.upper().strip("\n").split(":")
initials.append(line[1][0])
countries.append(line[1])
incomes.append(line[2])
for i,country in enumerate(countries):
dict1[country] = incomes[i]
dict2[initials[i]].add(country)
print(dict2["L"])
结果:
{'LUXEMBOURG', 'LIECHTENSTEIN'}
请参阅:字典2的值应能包含国家列表。一种选择是使用列表作为字典中的值。在代码中,只要一个新国家/地区具有相同的首字母i,您就会覆盖每个键的值
s将作为值添加
此外,还可以使用字典类型的setdefault方法。此代码:
dictionary2 = {}
for country in countries:
dictionary2.setdefault(country[0], []).append(country)
应该足以优雅地创建第二个字典
setdefault,返回键的值。在本例中,键被设置为国家名称的第一个字母(如果已存在),或者再次插入一个新键,将该国家的第一个字母插入字典,其值为空集[]
编辑
如果希望设置值以进行更快的查找/成员资格测试,可以使用以下行:
dictionary2 = {}
for country in countries:
dictionary2.setdefault(country[0], set()).add(country)
字典2的值应能包含国家列表。一种选择是使用列表作为字典中的值。在代码中,每当添加具有相同首字母的新国家/地区作为值时,您都会覆盖每个键的值
此外,还可以使用字典类型的setdefault方法。此代码:
dictionary2 = {}
for country in countries:
dictionary2.setdefault(country[0], []).append(country)
应该足以优雅地创建第二个字典
setdefault,返回键的值。在本例中,键被设置为国家名称的第一个字母(如果已存在),或者再次插入一个新键,将该国家的第一个字母插入字典,其值为空集[]
编辑
如果希望设置值以进行更快的查找/成员资格测试,可以使用以下行:
dictionary2 = {}
for country in countries:
dictionary2.setdefault(country[0], set()).add(country)
您与所要查找的内容非常接近,可以分别填充字典,同时循环读取文件raw.txt的内容。您还可以先读取文件的内容,然后执行必要的操作来填充字典。您可以使用dict理解和groupby在python中使用漂亮的OneLiner来实现您的需求。下面是一个例子:
country_per_capita_dict = {}
letter_countries_dict = {}
keywordFile = [line.strip() for line in open('raw.txt' ,'r').readlines()]
您现在有了关键字文件中所有行的列表,如下所示:
['1:Qatar:98900', '2:Liechtenstein:89400', '3:Luxembourg:80600', '4:Bermuda:69900', '5:Singapore:59700', '6:Jersey:57000', '7:Libya:1000', '8:Sri Lanka:5000']
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
from itertools import groupby
country_per_capita_dict = {}
letter_countries_dict = {}
keywordFile = [line.strip() for line in open('raw.txt' ,'r').readlines()]
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
country_list = country_per_capita_dict.keys()
country_list.sort()
letter_countries_dict = {k: list(g) for k,g in groupby(country_list, key=lambda x:x[0]) }
print (country_per_capita_dict)
print (letter_countries_dict)
在项目上循环时,可以拆分“:”并根据需要使用[1]和[2]索引值
您可以使用字典理解,如下所示:
['1:Qatar:98900', '2:Liechtenstein:89400', '3:Luxembourg:80600', '4:Bermuda:69900', '5:Singapore:59700', '6:Jersey:57000', '7:Libya:1000', '8:Sri Lanka:5000']
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
from itertools import groupby
country_per_capita_dict = {}
letter_countries_dict = {}
keywordFile = [line.strip() for line in open('raw.txt' ,'r').readlines()]
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
country_list = country_per_capita_dict.keys()
country_list.sort()
letter_countries_dict = {k: list(g) for k,g in groupby(country_list, key=lambda x:x[0]) }
print (country_per_capita_dict)
print (letter_countries_dict)
其结果是:
{'Qatar': '98900', 'Libya': '1000', 'Singapore': '59700', 'Luxembourg': '80600', 'Liechtenstein': '89400', 'Bermuda': '69900', 'Jersey': '57000'}
同样,使用itertools中的groupby,您可以获得:
from itertools import groupby
country_list = country_per_capita_dict.keys()
country_list.sort()
letter_countries_dict = {k: list(g) for k,g in groupby(country_list, key=lambda x:x[0]) }
这将生成所需的词典首字母:[国家列表]
完整示例如下所示:
['1:Qatar:98900', '2:Liechtenstein:89400', '3:Luxembourg:80600', '4:Bermuda:69900', '5:Singapore:59700', '6:Jersey:57000', '7:Libya:1000', '8:Sri Lanka:5000']
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
from itertools import groupby
country_per_capita_dict = {}
letter_countries_dict = {}
keywordFile = [line.strip() for line in open('raw.txt' ,'r').readlines()]
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
country_list = country_per_capita_dict.keys()
country_list.sort()
letter_countries_dict = {k: list(g) for k,g in groupby(country_list, key=lambda x:x[0]) }
print (country_per_capita_dict)
print (letter_countries_dict)
说明:
该行:
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
在下面的列表上循环
['1:卡塔尔:98900','2:列支敦士登:89400','3:卢森堡:80600','4:百慕大:69900','5:新加坡:59700','6:泽西岛:57000','7:利比亚:1000','8:斯里兰卡:5000',]并将列表中的每个条目拆分为:
然后,它将索引[1]和[2]中的值(即国家名称和人均值)编入词典
country_list = country_per_capita_dict.keys()
country_list.sort()
这一行将从之前创建的词典中提取所有国家的名称,并将它们按字母顺序排序,以便groupby正常工作
letter_countries_dict = {k: list(g) for k,g in groupby(country_list, key=lambda x:x[0]) }
此lambda表达式将输入作为国家列表,并将每个x以x[0]开头的国家的名称分组到列表G中。您非常接近您要查找的内容,您可以分别填充词典,同时循环读取文件raw.txt的内容。您还可以先读取文件的内容,然后执行必要的操作来填充字典。您可以使用dict理解和groupby在python中使用漂亮的OneLiner来实现您的需求。下面是一个例子:
country_per_capita_dict = {}
letter_countries_dict = {}
keywordFile = [line.strip() for line in open('raw.txt' ,'r').readlines()]
您现在有了关键字文件中所有行的列表,如下所示:
['1:Qatar:98900', '2:Liechtenstein:89400', '3:Luxembourg:80600', '4:Bermuda:69900', '5:Singapore:59700', '6:Jersey:57000', '7:Libya:1000', '8:Sri Lanka:5000']
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
from itertools import groupby
country_per_capita_dict = {}
letter_countries_dict = {}
keywordFile = [line.strip() for line in open('raw.txt' ,'r').readlines()]
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
country_list = country_per_capita_dict.keys()
country_list.sort()
letter_countries_dict = {k: list(g) for k,g in groupby(country_list, key=lambda x:x[0]) }
print (country_per_capita_dict)
print (letter_countries_dict)
在项目上循环时,可以拆分“:”并根据需要使用[1]和[2]索引值
您可以使用字典理解,如下所示:
['1:Qatar:98900', '2:Liechtenstein:89400', '3:Luxembourg:80600', '4:Bermuda:69900', '5:Singapore:59700', '6:Jersey:57000', '7:Libya:1000', '8:Sri Lanka:5000']
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
from itertools import groupby
country_per_capita_dict = {}
letter_countries_dict = {}
keywordFile = [line.strip() for line in open('raw.txt' ,'r').readlines()]
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
country_list = country_per_capita_dict.keys()
country_list.sort()
letter_countries_dict = {k: list(g) for k,g in groupby(country_list, key=lambda x:x[0]) }
print (country_per_capita_dict)
print (letter_countries_dict)
其结果是:
{'Qatar': '98900', 'Libya': '1000', 'Singapore': '59700', 'Luxembourg': '80600', 'Liechtenstein': '89400', 'Bermuda': '69900', 'Jersey': '57000'}
同样,使用itertools中的groupby,您可以获得:
from itertools import groupby
country_list = country_per_capita_dict.keys()
country_list.sort()
letter_countries_dict = {k: list(g) for k,g in groupby(country_list, key=lambda x:x[0]) }
这将生成所需的词典首字母:[国家列表]
完整示例如下所示:
['1:Qatar:98900', '2:Liechtenstein:89400', '3:Luxembourg:80600', '4:Bermuda:69900', '5:Singapore:59700', '6:Jersey:57000', '7:Libya:1000', '8:Sri Lanka:5000']
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
from itertools import groupby
country_per_capita_dict = {}
letter_countries_dict = {}
keywordFile = [line.strip() for line in open('raw.txt' ,'r').readlines()]
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
country_list = country_per_capita_dict.keys()
country_list.sort()
letter_countries_dict = {k: list(g) for k,g in groupby(country_list, key=lambda x:x[0]) }
print (country_per_capita_dict)
print (letter_countries_dict)
说明:
该行:
country_per_capita_dict = {entry.split(':')[1] : entry.split(':')[2] for entry in keywordFile}
在下面的列表上循环
['1:卡塔尔:98900','2:列支敦士登:89400','3:卢森堡:80600','4:百慕大:69900','5:新加坡:59700','6:泽西岛:57000','7:利比亚:1000','8:斯里兰卡:5000',]并将列表中的每个条目拆分为:
然后,它将索引[1]和[2]中的值(即国家名称和人均值)编入词典
country_list = country_per_capita_dict.keys()
country_list.sort()
这一行将从之前创建的词典中提取所有国家的名称,并将它们按字母顺序排序,以便groupby正常工作
letter_countries_dict = {k: list(g) for k,g in groupby(country_list, key=lambda x:x[0]) }
此lambda表达式将输入作为国家列表,并将每个x以x[0]开头的国家的名称分组到listg中。setdefault可以,但defaultdict是首选方法。setdefault可以,但defaultdict是首选方法。groupby仅在数据按字母顺序排序的情况下才能像您描述的那样工作。否则,每当键的返回值更改时,groupby都会将数据拆分为一个单独的组,而不管两个组是否共享同一个键值。您肯定应该在c语言中的某个地方添加一个排序操作
颂诗最好在您完成country\u list=country\u peror\u capital\u dict.keys之后,因为在早于3.6Thanks@tel的Python版本中,dict并没有被订购,这很好!我做了必要的编辑。groupby只有在按字母顺序对数据进行排序的情况下才能像您描述的那样工作。否则,每当键的返回值更改时,groupby都会将数据拆分为一个单独的组,而不管两个组是否共享同一个键值。您肯定应该在代码的某个地方添加排序操作。最好在您完成country\u list=country\u peror\u capital\u dict.keys之后,因为在早于3.6Thanks@tel的Python版本中,dict并没有被订购,这很好!我做了必要的编辑。