Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.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 如何在dict中添加索引_Python_List_Dictionary_Indexing_List Comprehension - Fatal编程技术网

Python 如何在dict中添加索引

Python 如何在dict中添加索引,python,list,dictionary,indexing,list-comprehension,Python,List,Dictionary,Indexing,List Comprehension,例如,假设: ['A', 'B', 'A', 'B'] 我想要: {'A': [0, 2], 'B': [1, 3]} 我试过一个像这样的循环;添加字符所在位置的索引,然后将其替换为',以便下次循环通过时,它将传递到下一个字符 但是,由于其他原因,循环不起作用,我不知道如何继续。一个简单的字典理解应该可以做到: {key: [index for index, x in enumerate(my_list) if x == key] for key in my_list} 一个简单的

例如,假设:

['A', 'B', 'A', 'B']    
我想要:

{'A': [0, 2], 'B': [1, 3]}
我试过一个像这样的循环;添加字符所在位置的索引,然后将其替换为
'
,以便下次循环通过时,它将传递到下一个字符


但是,由于其他原因,循环不起作用,我不知道如何继续。一个简单的字典理解应该可以做到:

{key: [index for index, x in enumerate(my_list) if x == key] for key in my_list}
一个简单的试验:

>>>> my_list = ['A','B','A','B']
>>>> {key: [index for index, x in enumerate(my_list) if x == key] for key in my_list}
>>>> {'A': [0, 2], 'B': [1, 3]}

工作原理 在Python中经常用作for循环的语法糖。而不是写作

my_list = []
for item in range(10):
    my_list.append(item)
列表理解本质上可以让您将这一系列语句压缩成一行:

my_list = [item for item in range(10)]
每当你看到一个列表理解时,你应该记住它只是原始三行语句的浓缩版本。它们实际上是相同的——这里提供的唯一好处是简洁

一个类似的,相关的物种是。它类似于列表理解,只是它允许您同时指定键和值

词典理解的一个例子:

{k: None for k in ["Hello", "Adele"]}
>>>> {"Hello": None, "Adele": None}
在我提供的答案中,我只是使用了一本字典

  • my\u列表中拉出
    s
  • my_list
    中的每个
    键指定一个索引列表作为相应的值
从语法上讲,它扩展为一个相当复杂的程序,如下所示:

my_dict = {}
for key in my_list:
    indices = []
    for index,value in enumerate(my_list):
         if value == key:
              indices.append(index)
    my_dict[key] = indices
这里,
enumerate
是一个标准的库函数,返回元组列表。每个元组的第一个元素引用列表的索引,第二个元素引用列表中该索引处的值

注意:

 enumerate(['a','b','a','b'])
 >>>> [(0,'a'),(1,'b'),(2,'b'),(3,'b')]
这就是
枚举的威力

效率 一如既往,过早的优化是万恶之源。确实,这种实现是低效的:它重复工作,并以二次时间运行。然而,重要的是要问对于你的特定任务是否合适。对于相对较小的列表,这就足够了

您可以查看某些优化@威林克斯的方法很有效@Rob在评论中建议迭代
集合(我的列表)
,这样可以防止重复工作

使用和:

为什么不改用from
itertools

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> 
>>> for i,x in enumerate(l):
        d[x].append(i)


>>> d
defaultdict(<class 'list'>, {'A': [0, 2], 'B': [1, 3]})
>>从集合导入defaultdict
>>>d=默认DICT(列表)
>>> 
>>>对于枚举(l)中的i,x:
d[x].附加(i)
>>>d
defaultdict(,{'A':[0,2],'B':[1,3]})

您所需要做的就是为您使用正确的数据类型。检查此链接-python文档。祝你好运希望这有帮助

资料来源:


这种理解重复了工作。也许
。。。对于输入设置(我的列表)
?这对我来说是新的,你能告诉我它是如何工作的吗?​​​​​​​​​​​​​​​嗯……请注意,由于这种方法会一次又一次地在列表上循环,我认为它会比。优化不是一个问题,而且这种方法看起来相对简单得多。@LtotheV:​​​​​​​​​​​​​​​其实这种方式比较复杂。因为这种方法调用
枚举(我的列表)
“我的列表的长度”
+1”次。但是willnx的方法只需调用
enumerate(我的列表)
一次。那是不同的。但是,是的,这是一个单线版本。但是如果你的列表有点大,我不建议你用这种方式。​​​​​​​​​​​​​​​您也可以从集合中导入defaultdict
并使用
mydict=defaultdict(list)
,这样您就不需要自己运行
mydict.setdefault(item,[])
了,我认为这会更像Python。但接下来您必须导入它:P很好的一点-如果您想提交一个使用该或setdefault的编辑示例,我会接受的。​​​​​​​​​​​​​​​嗯,反正不是这样。因此,我不会提交编辑。但不管怎样,这是。等一下。。。
collections
中不是
defaultdict
吗?OP提到没有导入任何内容吗
defaultdict
是从stdlib导入的一个非常常见的东西,这甚至不是同一个问题。他试图在dict中存储列表中某个值的索引,而不是基于value@DanGayle我的错!要么我没有正确阅读,要么后来添加了进一步的解释,。谢谢你指出:)
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> 
>>> for i,x in enumerate(l):
        d[x].append(i)


>>> d
defaultdict(<class 'list'>, {'A': [0, 2], 'B': [1, 3]})
>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])