Python字典推导式用于列表中的字典

3
我希望从下面的列表中创建一个词典。
[{'fips': '01001', 'state': 'AL', 'name': 'Autauga County'}, {'fips': '20005', 'state': 'KS', 'name': 'Atchison County'}, {'fips': '47145', 'state': 'TN', 'name': 'Roane County'}]

结果应该以名称作为键,以“美国”作为值。
例如:
{'Autauga County': 'United States', 'Atchison County' : 'United States',  'Roane County' : 'United States'}

我可以用几个for循环来实现这个,但我想学习如何使用字典解析来实现。


1
你可能需要指明你正在使用的Python版本。 - AK47
4个回答

11
in_list = [{'fips': '01001', 'state': 'AL', 'name': 'Autauga County'}, 
           {'fips': '20005', 'state': 'KS', 'name': 'Atchison County'},
           {'fips': '47145', 'state': 'TN', 'name': 'Roane County'}]

out_dict = {x['name']: 'United States' for x in in_list if 'name' in x}

学习笔记:

  • 列表推导式只适用于 Python 2.7 及以上版本。
  • 字典推导式与列表推导式非常相似,只是使用花括号 {}(和键)。
  • 如果你不知道,你也可以在推导式的 for 循环后添加更复杂的控制流程,例如 [x for x in some_list if (cond)]

为了完整起见,如果无法使用推导式,请尝试以下方法:

out_dict = {}

for dict_item in in_list:
    if not isinstance(dict_item, dict):
        continue

    if 'name' in dict_item:
        in_name = dict_item['name']
        out_dict[in_name] = 'United States'

正如评论中所提到的,对于Python 2.6,您可以使用以下代码替换{k: v for k,v in iterator}


{iterator.next(): iterator.next() for i in range(len(iterator) / 2)}
dict((k,v) for k,v in iterator)

您可以在这个问题中了解更多信息。

编码愉快!


1
哦,我的错 - 我太习惯Python 3了。我必须说,虽然我在这里还是新手,但这是我得到的最快的一组踩票 - 是因为缺乏对Python 2的支持还是有其他原因? - Jamie Phan
明白哈哈(虽然真的很快),我还以为自己做错了什么事。会记住的,谢谢! - Jamie Phan
3
我很困惑为什么你的回答会被踩。如果问题没有给出版本号,写Python 2.7或3的回答都可以,不用感到难过。 - Georg Schölly
2
我也感到困惑。我认为可以安全地假设,当问题涉及字典推导时,我们正在谈论支持字典推导的Python版本... - juanpa.arrivillaga
1
哈哈,谢谢大家!我对声望并不是特别在意,我认为回答问题是学习编程的好方法,而且负评只会让你写出最好的代码!顺便说一句,有人应该给出同时支持Python 2.x和3.x的答案,我期待着(我已经有一段时间没用Python 2了)。 - Jamie Phan
显示剩余3条评论

2

这是一个适用于Python 2.7.x和Python 3.x的小解决方案:

data = [
    {'fips': '01001', 'state': 'AL', 'name': 'Autauga County'},
    {'fips': '20005', 'state': 'KS', 'name': 'Atchison County'},
    {'fips': '47145', 'state': 'TN', 'name': 'Roane County'},
    {'fips': 'xxx', 'state': 'yyy'}
]

output = {item['name']: 'United States' for item in data if 'name' in item}
print(output)

-1

循环/生成器版本为:

location_list = [{'fips': '01001', 'state': 'AL', 'name': 'Autauga County'},
        {'fips': '20005', 'state': 'KS', 'name': 'Atchison County'},
        {'fips': '47145', 'state': 'TN', 'name': 'Roane County'}]
location_dict = {location['name']:'United States' for location in location_list}

输出:

{'Autauga County': 'United States', 'Roane County': 'United States',
 'Atchison County': 'United States'}

如果你在Stackoverflow上搜索字典推导式,那么使用{ }生成器表达式的解决方案就会出现:Python字典推导式


2
“dict”和“list”是不好的命名,因为它们会掩盖内置函数。 - Tagc

-2

那应该对你有帮助。

states_dict = [{'fips': '01001', 'state': 'AL', 'name': 'Autauga County'}, {'fips': '20005', 'state': 'KS', 'name': 'Atchison County'}, {'fips': '47145', 'state': 'TN', 'name': 'Roane County'}]

{states_dict[i]['name']:'United States' for i, elem in enumerate(states_dict)}

只是为了更好地理解,有什么问题吗?我相信它可以正常工作,我已经测试过了。 - BlackHawk
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Tagc
谢谢您和抱歉我的愚蠢回答。我还在学习中,只是想尽力帮忙。 - BlackHawk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接