Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从python中的列表创建位置映射字典_Python - Fatal编程技术网

从python中的列表创建位置映射字典

从python中的列表创建位置映射字典,python,Python,我有一张很多单词的单子 从中,我想创建一个字典,其中包含列表中作为键的每个唯一单词,以及它出现在(列表索引)中的第一个位置作为键的值 有没有一种有效的方法可以做到这一点?因为你无论如何都要看每一个单词,它不会比这更快: >>> l = ['a', 'b', 'c', 'b', 'a', 'd'] >>> import itertools as it >>> dict(it.izip(reversed(l), reversed(xrange(l

我有一张很多单词的单子

从中,我想创建一个字典,其中包含列表中作为键的每个唯一单词,以及它出现在(列表索引)中的第一个位置作为键的值


有没有一种有效的方法可以做到这一点?

因为你无论如何都要看每一个单词,它不会比这更快:

>>> l = ['a', 'b', 'c', 'b', 'a', 'd']
>>> import itertools as it
>>> dict(it.izip(reversed(l), reversed(xrange(len(l)))))
{'a': 0, 'b': 1, 'c': 2, 'd': 5}
index = {}

for position, word in enumerate(list_of_words):
    if word not in index:
        index[word] = position

@eumiro解决方案的修改版本

>>> from itertools import count, izip
>>> l = ['a', 'b', 'c', 'b', 'a', 'd']
>>> dict(izip(reversed(l),count(len(l)-1,-1))) #In Py 3 just use zip
{'a': 0, 'c': 2, 'b': 1, 'd': 5}
试试这个

l = ['a', 'b', 'c', 'b', 'a', 'd']
l2 = set(l)
mydict = {v:l.index(v) for  v in   l2}
输出


{'a':0,'b':1,'c':2,'d':5}

在要求一个有效的方法之前,你至少有一个有效的方法吗?到目前为止你都尝试了什么?事实上,我有一些代码试图在没有这样的字典的情况下做一些事情。用这本字典编写代码会更好,这就是我想要它的原因。但该代码与此处的主题无关,因此我没有发布。到目前为止,我尝试的是在列表中进行线性搜索,以提取每个单词的位置,这确实是一种可怕的方法。@Atriya你不可能比查看每个单词更快,因为在进行线性搜索之前,你不知道单词是什么。消除重复需要O(n*log(n)),因此O(n)中的任何解决方案都更快。Nah
zip
python3
交叉兼容,它实际上返回一个生成器。在这方面,您可能应该使用
range
而不是
xrange
。建议:使用
reversed
而不是
[:-1]
@RikPoggi试试看。一开始我不这么认为。@Marcin:它似乎返回了一个
范围迭代器,很好!这是怎么回事?这是O(n)-对于列表中的n个字,它执行一个或两个固定时间操作。@eumiro这是O(n),因为哈希映射对所有内容都有O(1)的摊销成本。它和你的衣服一模一样solution@Marcin-哦,对不起,我错了。当然,这也是O(n)。这是他最初拥有的。迭代器版本在大型列表上稍微好一点,因为它不需要构造中间数据结构。你说它更好是什么意思。这只是写他的第一个解决方案的另一种方式,对我来说似乎更干净。我不知道你所说的
是什么意思,迭代器版本在大型列表上稍微好一点
。如果您指的是
izip
,那么很容易将其更改为Python2.x版本。我的意思是它更好,因为它不会在任何一个(主要)python版本中创建中间对象。但是它在Python3中都不起作用,因为
izip
已更改为
zip
。然后将导入包装在
try
中。
l = ['a', 'b', 'c', 'b', 'a', 'd']
l2 = set(l)
mydict = {v:l.index(v) for  v in   l2}