有没有更好的方法使用键但没有值将列表转换为Python中的字典?

PyN*_*bie 6 python dictionary list-comprehension list

我确信会有一个单行将列表转换为字典,其中列表中的项目是键,字典没有值.

我发现做这件事的唯一方法是反对.

"当忽略结果时使用列表推导会产生误导和低效.for循环更好"

myList = ['a','b','c','d']
myDict = {}
x=[myDict.update({item:None}) for item in myList]

>>> myDict
{'a': None, 'c': None, 'b': None, 'd': None}
Run Code Online (Sandbox Code Playgroud)

它有效,但是有更好的方法吗?

Aym*_*ieh 23

用途dict.fromkeys:

>>> my_list = [1, 2, 3]
>>> dict.fromkeys(my_list)
{1: None, 2: None, 3: None}
Run Code Online (Sandbox Code Playgroud)

值默认为None,但您可以将它们指定为可选参数:

>>> my_list = [1, 2, 3]
>>> dict.fromkeys(my_list, 0)
{1: 0, 2: 0, 3: 0}
Run Code Online (Sandbox Code Playgroud)

来自文档:

a.fromkeys(seq [,value])使用seq中的键和值设置为值创建一个新字典.

dict.fromkeys是一个返回新字典的类方法.value默认为None.版本2.3中的新功能.


Gre*_*ill 15

您可以使用集合而不是字典:

>>> myList=['a','b','c','d']
>>> set(myList)
set(['a', 'c', 'b', 'd'])
Run Code Online (Sandbox Code Playgroud)

如果您永远不需要存储值,并且只存储无序的唯一项集合,则更好.


Ale*_*lli 5

为了回答原始提问者的性能担忧(对于dictvs中的查找set),有点令人惊讶的是,dict查找可以更快(在我相当慢的笔记本电脑上的Python 2.5.1中)假设例如一半的查找失败而一半成功.以下是发现的方法:

$ python -mtimeit -s'k=dict.fromkeys(range(99))' '5 in k and 112 in k'
1000000 loops, best of 3: 0.236 usec per loop
$ python -mtimeit -s'k=set(range(99))' '5 in k and 112 in k'
1000000 loops, best of 3: 0.265 usec per loop
Run Code Online (Sandbox Code Playgroud)

多次进行每次检查以确认它们是可重复的.因此,如果慢速笔记本电脑上的那些30纳秒或更短时间处于绝对关键的瓶颈状态,那么对于模糊的dict.fromkeys解决方案而言可能是值得的,而不是简单,明显,可读和明确正确set(不寻常 - 在Python中几乎无一例外)并且直接解决方案也具有性能优势).

当然,需要检查一个人自己的Python版本,机器,数据以及成功与失败测试的比例,通过非常准确的分析确认,从这个查找中删除30纳秒(或其他)将产生重要的差异.

幸运的是,在绝大多数情况下,这将证明是完全没有必要的......但是由于程序员无论如何都会着迷于无意义的微优化,无论他们多少次被告知他们的无关紧要,模块就在标准中无论如何,使这些大多数毫无意义的微观基准变得简单的库! - )timeit