Dict相同的键-示例39艰苦地学习Python

Dict相同的键-示例39艰苦地学习Python,python,dictionary,Python,Dictionary,新的编码和工作通过泽德肖的学习蟒蛇3的艰苦的方式 我想制作一个dict,将一个键映射到多个城市,但很快发现每个键都必须是唯一的,重复使用同一个键只会覆盖以前的值 这是我的原始代码: states = { 'Pennsylvania': 'PA', 'Maryland': 'MD', 'Texas': 'TX'} cities = { 'PA': 'State College', 'PA': 'Spring Mills', 'PA': 'Pitts

新的编码和工作通过泽德肖的学习蟒蛇3的艰苦的方式

我想制作一个dict,将一个键映射到多个城市,但很快发现每个键都必须是唯一的,重复使用同一个键只会覆盖以前的值

这是我的原始代码:

states = {
    'Pennsylvania': 'PA',
    'Maryland': 'MD',
    'Texas': 'TX'}

cities = {
    'PA': 'State College',
    'PA': 'Spring Mills',
    'PA': 'Pittsburgh',
    'PA': 'Philadelphia',
    'PA': 'Eerie',
    'MD': 'Frederick',
    'MD': 'Salisbury',
    'MD': 'Swanton',
    'MD': 'Baltimore',
    'TX': 'Midland',
    'TX': 'Dallas',
    'TX': 'Houston',
    'TX': 'Galveston'
}

for state, abbrev in states.items():
    x = "%s is abbreviated: %s" % (state, abbrev)
    print(x)

for abbrev, city in cities.items():
    x = "%s has the city %s in it" % (abbrev, city)
    print(x)
接下来,我发现可以在dict中使用一个列表作为值。因此我尝试这样做,并制作了一个嵌套for循环来分别调用每个城市:

states = {
    'Pennsylvania': 'PA',
    'Maryland': 'MD',
    'Texas': 'TX'}

cities = {
    'PA': ['State College',
    'Spring Mills',
    'Pittsburgh',
    'Philadelphia',
    'Eerie'],
    'MD': ['Frederick',
    'Salisbury',
    'Swanton',
    'Baltimore'],
    'TX': ['Midland',
    'Dallas',
    'Houston',
    'Galveston']
}

for state, abbrev in states.items():
    x = "%s is abbreviated: %s" % (state, abbrev)
    print(x)

for abbrev, city in cities.items():
    count = 0
    for i in cities.get(abbrev):
        city_list = cities.get(abbrev)
        x = "%s has the city %s in it" % (abbrev, city_list[count])
        print(x)
        count += 1

我的问题是,是否有更好(更简化?)的方法将多个城市映射到一个州,并在以后获取该值,或者dict中的列表是否是这里的最佳方法。可能我在书中还没有找到更好的方法,但我愿意接受所有的回答。感谢您抽出时间阅读本文。希望不是太冗长。

我看不出你做的有什么不对——如果我必须解决这个问题,我可能会这样做。本书后面可能会提到的唯一改进是为每个州创建一个类,然后将缩写存储在如下属性中:

class State:
def __init__(self, name, abbreviation, cities):
    self.name = name
    self.abbreviation = abbreviation
    self.cities = cities
    
penn = State("Pennsylvania", "PA", ["Pittsburgh", "Philadelphia", "Hershey"])
print(penn.name)
print(penn.abbreviation)
print(penn.cities)
您会发现,随着您使用越来越复杂的程序,类结构变得越来越有用。我发现自己甚至在函数式编程语言中使用了类似类的东西


继续努力

我看不出你做的有什么不对——如果必须解决这个问题,我可能会这样做。本书后面可能会提到的唯一改进是为每个州创建一个类,然后将缩写存储在如下属性中:

class State:
def __init__(self, name, abbreviation, cities):
    self.name = name
    self.abbreviation = abbreviation
    self.cities = cities
    
penn = State("Pennsylvania", "PA", ["Pittsburgh", "Philadelphia", "Hershey"])
print(penn.name)
print(penn.abbreviation)
print(penn.cities)
您会发现,随着您使用越来越复杂的程序,类结构变得越来越有用。我发现自己甚至在函数式编程语言中使用了类似类的东西


继续努力

字典和列表的概念不错。当我使用API时,我会看到这样的事情。我可以将您的第二个“for循环”简化为:

for abbrev, cities in cities.items():
    for city in cities:
        print("%s has the city %s in it" % (abbrev, city))
对于修改后的代码,这里同样重要的是,如果您或其他人将下一对(key=value)添加到字典中,而value不是列表,则可能会出现问题。新的对应该以列表的形式包含值,即使只有一个元素

看看defaultdict,如果您想以这种方式继续您的容器,可以提供一些操作来阻止可能的问题


正如J.D.Rudie已经提到的,类也是可读性和性能的伟大解决方案。要了解原因,请搜索一些有关密钥共享字典的信息。

字典和列表的概念不错。当我使用API时,我会看到这样的事情。我可以将您的第二个“for循环”简化为:

for abbrev, cities in cities.items():
    for city in cities:
        print("%s has the city %s in it" % (abbrev, city))
对于修改后的代码,这里同样重要的是,如果您或其他人将下一对(key=value)添加到字典中,而value不是列表,则可能会出现问题。新的对应该以列表的形式包含值,即使只有一个元素

看看defaultdict,如果您想以这种方式继续您的容器,可以提供一些操作来阻止可能的问题


正如J.D.Rudie已经提到的,类也是可读性和性能的伟大解决方案。要了解原因,请搜索一些有关密钥共享词典的信息。

如前所述,谢谢你们的回答。在过去的两天里,我一直在学习OOP的课程和基础知识。我采纳了您的建议,并编写了以下新代码:

class State(object):

    def __init__ (self, State, Abbrev, City):
        self.State = State
        self.Abbrev = Abbrev
        self.City = City

states = [
    'Pennsylvania',
    'Maryland',
    'Texas']

states.sort()

Abbrev_dict = {'Pennsylvania':'PA','Maryland': 'MD','Texas': 'TX'}

city_dict = {
    'PA': ['State College',
    'Spring Mills',
    'Pittsburgh',
    'Philadelphia',
    'Eerie'],
    'MD': ['Frederick',
    'Salisbury',
    'Swanton',
    'Baltimore'],
    'TX': ['Midland',
    'Dallas',
    'Houston',
    'Galveston']
}

state_list = []
for state in states:
    abbrev = Abbrev_dict[state]
    cities = city_dict[abbrev]
    state_list = State(state, abbrev, cities)
    print(state_list.State, state_list.Abbrev, state_list.City)
你们的两个答案帮助我更好地理解了课程和循环,所以谢谢你们。我正在发布我的更新代码,以便将来有人能够引用它,并了解我如何将您的建议应用到书中的示例中

编辑:如果我要对所有50个州都这样做,我会首先按字母顺序对列表“州”进行排序,否则,如果你想调用变量,通过查看state_列表中的对象,你将不知道哪个对象对应于哪个州


编辑:^^将排序添加到代码中,以按字母顺序列出状态

,如前所述,谢谢你们的回答。在过去的两天里,我一直在学习OOP的课程和基础知识。我采纳了您的建议,并编写了以下新代码:

class State(object):

    def __init__ (self, State, Abbrev, City):
        self.State = State
        self.Abbrev = Abbrev
        self.City = City

states = [
    'Pennsylvania',
    'Maryland',
    'Texas']

states.sort()

Abbrev_dict = {'Pennsylvania':'PA','Maryland': 'MD','Texas': 'TX'}

city_dict = {
    'PA': ['State College',
    'Spring Mills',
    'Pittsburgh',
    'Philadelphia',
    'Eerie'],
    'MD': ['Frederick',
    'Salisbury',
    'Swanton',
    'Baltimore'],
    'TX': ['Midland',
    'Dallas',
    'Houston',
    'Galveston']
}

state_list = []
for state in states:
    abbrev = Abbrev_dict[state]
    cities = city_dict[abbrev]
    state_list = State(state, abbrev, cities)
    print(state_list.State, state_list.Abbrev, state_list.City)
你们的两个答案帮助我更好地理解了课程和循环,所以谢谢你们。我正在发布我的更新代码,以便将来有人能够引用它,并了解我如何将您的建议应用到书中的示例中

编辑:如果我要对所有50个州都这样做,我会首先按字母顺序对列表“州”进行排序,否则,如果你想调用变量,通过查看state_列表中的对象,你将不知道哪个对象对应于哪个州


编辑:^^将排序添加到代码中,以按字母顺序列出状态

感谢快速响应J.D.看来类在前进中肯定会很有用,并有助于使我的代码更有条理,更易于阅读。我在书中展望未来,在接下来的几个例子中介绍了课程。我将使用您的代码和我在接下来的几个练习中学习的内容返回到本练习并重试。upvote/接受你的答案,但由于这是我的第一篇帖子,upvote还没有足够的声誉来展示。感谢快速回复,J.D.看来课程在前进中肯定会很有用,并有助于使我的代码更有条理,更易于阅读。我在书中展望未来,在接下来的几个例子中介绍了课程。我将使用您的代码和我在接下来的几个练习中学习的内容返回到本练习并重试。更新投票/接受你的答案,但由于这是我的第一篇帖子,更新投票的声望还不够高。啊,这确实简化了我的解决方案