2016-06-13 95 views
0

我是非常新的Python,所以请裸露在我身边(使用学习python的困难方式,它不能很好地解释这一点)。具有多个值的Python字典密钥

我正在学习字典,我知道我可以通过创建两个字典来实现这一点,但为了简洁起见,我想让代码更简洁一点,而不是再创建两个字典(已授予,最后,我为这个词典所写的所有内容都必须写在其他词典中),所以我想我比任何事都更好奇。而且我知道我不应该使用for循环,但我不知道另一种方式,就LPTH吮吸而言,我不得不从某处开始。

问题1:我如何得到这个循环遍历每个州/省/城市?我是否需要制作多个词典或一系列列表并使用它们?问题2:为什么这段代码运行for循环11次?

states1 = { 
    '1': 'Oregon', 'a': 'OR','population': '1000', 
    '2': 'Florida', 'b': 'MI', 'population': '1000', 
    '3': 'California', 'c': 'CA', 'population': '1000', 
    '4': 'NewYork', 'd': 'NY', 'population': '1000', 
    '5': 'Michigan','e': 'MI','population': '1000', 
} 

for city, pop, in states1.items(): 
    print "%s has the abbreviation %s and a population of %s" %states1['1'], states1['a'], states1['population']) 

回答

1

理想情况下,你会有一个homgonous数据结构 - 例如, a listdict 。每个dict将持有的有关特定状态:

states1 = [ 
    {'name': 'Oregon', 'abbrev': 'OR', 'population': 1000}, 
    {'name': 'Florida', 'abbrev': 'FL', 'population': 1000}, 
    ..., 
] 

现在你的循环如下所示:

for state in states1: 
    print print "%s has the abbreviation %s and a population of %s" % (state['name'], states['abbrev'], states['population']) 

这样做的好处是希望清晰。对于任何给定的状态,都以相同的方式检索相关信息(通过'name'键可以始终访问州的名称)。

如果你需要国家名称的映射(例如,你想通过自己的缩写查找一堆国家的人口),你可以做到这一点很容易地创建一个字典...

abbrev_to_state = {state['abbrev']: state for state in states1} 
florida_data = abbrev_to_state['FL'] 
new_hampshire_data = abbrev_to_state['NH'] 
... 

此处还有其他选项...您可以使用自定义类,但这似乎也是collections.namedtuple列表的一个好候选,假设您不打算更改数据。

+0

这帮了TON mgilbson,我不敢相信我没有想到这件事,现在看起来很愚蠢! – Wolverine

0

您可以使每个值成为一个列表。

我不明白你想实现什么,但最简单的方法是:

states1 = { 
1: ["Oregon", "OR", 1000] 
2: ["Florida", "FL", 1000] 
3: ["Pythonville", "PY", 1000] 
4: ["Dictville", "DI", 1000] 
} 

你可以看看了另一件事情是named tuple,这是我最喜欢的数据结构之一,当你想快速组织数据。

from collections import namedtuple 

CityInfo = namedtuple("CityInfo", ["Name", "Abbr", "Pop"]) 

states1 = { 
      1: CityInfo("Oregon", "OR", 1000), 
      2: CityInfo("Florida", "FL", 1000), 
      3: CityInfo("Pythonville", "PY", 1000), 
      4: CityInfo("Dictville", "DI", 1000) 
      } 

for city in states1.values(): 
    print("{} has the abbreviation {} and a population of {}".format(city.Name, city.Abbr, city.Pop)) 
+1

FWIW,以连续整数作为键的字典似乎有点像浪费内存。在这种情况下,“list”通常更好:-) – mgilson

+0

是的,是的。但我不想完全改变他的代码。 – SirSteel

0

当我运行它,你推荐我去(见下文),它吐出

Michigan has the abbreviation MI and a population of 1000 
Michigan has the abbreviation MI and a population of 1000 
Michigan has the abbreviation MI and a population of 1000 

不知道为什么它继续这样做,我也能猜到,如果它是出于某种原因选择一个完全随机的状态,因为它是一个字典,每次都会改变状态,偶尔会出现重复。

states1 = { 
    'state': 'Oregon', 'abbrev': 'OR','population': '10000', 
    'state': 'Florida', 'abbrev': 'MI', 'population': '1000', 
    'state': 'California', 'abbrev': 'CA', 'population': '1000', 
    'state': 'NewYork', 'abbrev': 'NY', 'population': '1000', 
    'state': 'Michigan','abbrev': 'MI','population': '1000', 
} 

for city, pop, in states1.items(): 
    print "%s has the abbreviation %s and has a population of %s" % (states1['state'], states1['abbrev'], states1['population']) 
0

另一个如何根据您的需求构造数据的示例。

states1 = { 
'Oregon': {'abrv': 'OR','population': '1000'}, 
'Florida':{ 'abrv': 'MI', 'population': '1000'}, 
'California':{'abrv': 'CA', 'population': '1000'}, 
'NewYork':{'abrv': 'NY', 'population': '1000'}, 
'Michigan':{'abrv': 'MI','population': '1000'}} 



for state in states1: 
    print "%s has the abbreviation %s and a population of %s" %(state, states1[state]['abrv'], states1[state]['population']) 
+0

我认为这看起来非常完美,就像第一个建议一样,但都给了我错误。这一个说“File”ex39-test2.py“,第12行,在 print”%s有缩写%s,并且有%s的总数“%(state,states1 [state] ['abbrev'],状态1 [状态] ['人口']) TypeError:不可取消类型:'dict'“ – Wolverine

+0

不确定为什么你会得到该错误,如果你是准确的代码。如果我试图使用字典作为关键字,那么不可用的字典类型会提高。 – user4642224

0

刚刚看到最后一篇文章,这很有道理。至于如何这可能是有用的,我不知道,这只是我想要做的事情,有三个值的一个关键。我相信未来我可以从网站或数据库中获取信息,并让它创建配对,就像扮演角色的演员一样,但也许不会。这只是我烦恼的事情,我无法自己想出来。

相关问题