用Python从列表和固定变量创建字典

4

我将尝试从一个列表和一个固定变量中创建一个字典。我知道zip()可以从两个列表创建一个字典,但是如何调整它以接受一个固定变量?

有效的方法:

countries = ["Italy", "Germany", "Spain", "USA", "Switzerland"]
dishes = ["pizza", "sauerkraut", "paella", "Hamburger"]
country_specialities = zip(countries, dishes)

我需要的是:

dishes = ["pizza", "sauerkraut", "paella", "Hamburger"]
country = "uk"

输出结果:
menu = {"pizza": "uk", "sauerkraut": "uk", "paella": "uk", "Hamburger": "uk"}

你尝试了什么?例如,制作一个包含四个 'uk' 的列表似乎非常琐碎,然后你可以像以前一样将其传递给 zip - jonrsharpe
我使用这些值作为示例,真实列表有近20万个值。 - algorhythm
4个回答

7
{dish: country for dish in dishes}

1
字典推导式实际上是一种过度设计,因为你可以在这里简单地使用 dict.fromkeys(dishes, country)(这样会更快)。 - Martijn Pieters

7
您可以在这里使用 dict.fromkeys() 类方法:
dict.fromkeys(dishes, country)

请注意,除非您打算在所有键之间共享可变值,否则不应在默认值为可变值的情况下使用此功能。
根据文档:
创建一个新字典,其中键来自seq,值设置为value。fromkeys()是一个类方法,返回一个新字典。value默认为None。
这比使用字典推导要快得多;对dishes的循环完全由C代码完成,而字典推导会在Python字节码中执行循环。
如果您的列表将包含200,000个值,则会产生巨大差异:
>>> from timeit import timeit
>>> import random
>>> from string import ascii_lowercase
>>> values = [''.join([random.choice(ascii_lowercase) for _ in range(random.randint(20, 40))]) for _ in range(200000)]
>>> def dictcomp(values):
...     return {v: 'default' for v in values}
... 
>>> def dictfromkeys(values):
...     return dict.fromkeys(values, 'default')
... 
>>> timeit('f(values)', 'from __main__ import values, dictcomp as f', number=100)
4.984026908874512
>>> timeit('f(values)', 'from __main__ import values, dictfromkeys as f', number=100)
4.159089803695679

这两种选项在重复100次操作时,时间差近乎一秒钟。

2
你可以这样做:
dishes = ["pizza", "sauerkraut", "paella", "Hamburger"]
country = "uk"
menu = dict((dish, country) for dish in dishes)

1
扩展你正在使用的zip
In [54]: dict(zip(dishes, [country] * len(dishes)) )
Out[54]: {'Hamburger': 'uk', 'paella': 'uk', 'pizza': 'uk', 'sauerkraut': 'uk'}

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